diff --git a/docs/issue112-row-map/README.md b/docs/issue112-row-map/README.md new file mode 100644 index 0000000..f2d6523 --- /dev/null +++ b/docs/issue112-row-map/README.md @@ -0,0 +1,157 @@ +# Qwen row-map expert gather (#112) + +The sorted Qwen gate/up path now retains the uint32 token row map, builds GPU +per-expert row/tile prefix sums, and dispatches the pinned 64×64×64 NAX kernel. +The kernel reads original token rows and emits SwiGLU directly. Down projection +continues through the #110 guarded stock gather. The unsorted decode/verify +path is unchanged. Packed and separate gate/up weights preserve their original +activation rounding and fallback ordering. + +Oracle: MTPLX `9882703f3105363ddc37eca9f97aa09a1d387112`, MLX 0.32.2. +Installed Bare-Speed artifact: `74559cdf34fbfc0b593de72d17e93f37fd4f9ea7`; +artifact hashes and machine details are in ../issue104-ar/environment.json. +Native pre-port baseline: `8965e77ea173c932e00f70759d0a83ac1c5072f0`. + +Only GPU shader source is shipped from the oracle: the MTPLX kernel body and +its MLX 0.32.2 GPU template/functor closure, with MIT licenses in `metal/`. +`tools/issue112-extract-metal.py` reproduces those files from the pinned +reference environment. All scheduling, policy, graph construction, checking, +model loading and sessions remain Rust. There is no production Python/MLX/C +runtime dependency and the pinned runtime metallib is unchanged. + +## Route and failure contract + +- All original tensor/layout predicates, affine BF16/F16, b4/b8, groups + 32/64/128, N/K multiples of 64, and the 4,096-routed-row threshold apply. +- Below-threshold, non-NAX and ineligible inputs retain the stock path. + `MTPLX_MOE_SORTED_GATHER_KERNEL=0` and the GPU-family rehearsal switch are + resolved by Qwen policy without mutating the process environment. +- Whole-first-call canaries are keyed by compiled instantiation and the + under/from-64-rows-per-expert regime. They compare uint16 bits, including + signed zero, then reuse the checked result. Compile/dispatch failures or + mismatches disable that key for the process with a reason and counters. +- A failed packed SwiGLU canary tries the separately checked plain row-map + gather before guarded stock fallback, as upstream does. Separate SwitchGLU + returns to its original up/gate/compiled-activation chain. +- The only generalized helper is Qwen's GatherQMM: its existing BF16 behavior + is retained, with the F16/group-128 specializations needed for the oracle's + supported canary/fallback contract. All callers are in the Qwen module. + +## Isolated verification + +The native synthetic matrix covers 72 cases: BF16/F16 × b4/b8 × g32/64/128 × +packed/separate × 4,096/8,193/32,769 routed rows. It includes empty expert runs, +partial tiles, both canary regimes, a strided uint32 row map and int64 expert +IDs. Every result equals guarded stock and the pinned oracle bit for bit; +48 first-use canaries pass. Actual installed layer-0 projections additionally +cover 410/2,048/3,277/4,095/4,096/8,192 tokens (12 packed/separate cases). + +Failure injection uses actual invalid Metal source, a changed output sign bit, +and explicitly differing positive/negative zero. Each disables its key and +subsequent calls use exact stock output without another canary. Metadata and +policy tests cover all exclusion predicates and switch spellings. The full +model off-switch run checks the unchanged output/state and absence of kernel +activation. + +The full-model large-prefix control reuses #110's 7,374-token cold prompt and +3,278-token warm suffix at chunks 2,048 and 4,096. It checks every logit and +cache array against the pre-port, pinned-oracle receipts, plus cancellation +and retry. Explicit hidden-state tests use an MTP-capable runtime with cold +4,096-token and warm 2,048-token-suffix prefills; an AR-only runtime correctly +omits warm hidden arrays in the oracle. The AR timing tests compare complete +state after one generated token. State reads occur after measured intervals. + +## Paired release measurements + +M5 Max, 128 GiB; serial before/after processes, three repetitions per chunk +and phase, identical installed artifacts and token IDs. Both default boundary +splitting (tail interval 256) and full chunks (tail interval 0) are measured. +The latter exercises the wide row regime and guarded partial tails. The +release baseline uses unchanged committed production source with only the +same measurement test module added. No other GPU workload or build ran during +these measurements. + +Cells show median ± sample standard deviation across all three repetitions. +Repetition zero includes first-use initialization/canary work; this is not an +isolated measurement of canary overhead. All individual times and means are +in release-performance.json. TTFT starts at the request call and ends at its +first token callback, after model loading. + +| Tail policy / chunk / phase | Before TTFT s | After TTFT s | Before prefill tok/s | After prefill tok/s | +|---|---:|---:|---:|---:| +| Default / 2048 / cold | 2.959 ± 0.473 | 2.953 ± 0.480 | 1385.831 ± 183.340 | 1388.955 ± 186.819 | +| Default / 2048 / warm | 1.839 ± 0.075 | 1.900 ± 0.088 | 1115.426 ± 45.227 | 1079.363 ± 52.619 | +| Default / 4096 / cold | 3.690 ± 0.063 | 3.684 ± 0.029 | 1111.739 ± 19.009 | 1113.593 ± 8.843 | +| Default / 4096 / warm | 2.012 ± 0.013 | 1.989 ± 0.019 | 1019.529 ± 6.863 | 1031.159 ± 10.182 | +| Full / 2048 / cold | 2.411 ± 0.475 | 2.504 ± 0.428 | 1699.510 ± 259.818 | 1636.600 ± 239.080 | +| Full / 2048 / warm | 1.262 ± 0.063 | 1.334 ± 0.052 | 1623.785 ± 78.593 | 1536.347 ± 64.230 | +| Full / 4096 / cold | 3.100 ± 0.116 | 2.999 ± 0.136 | 1321.520 ± 49.755 | 1366.360 ± 58.429 | +| Full / 4096 / warm | 1.767 ± 0.057 | 1.634 ± 0.086 | 1159.717 ± 36.444 | 1254.103 ± 61.907 | + +Peak physical footprint: default 84.724 → 84.669 GB; full chunks +88.579 → 87.952 GB. The results are mixed and do not establish an overall +speedup. In particular, the default 256-token tail grid often keeps the small +stock route; setting chunk size 4096 does not imply every body call has that +width. The port fulfills the current-route obligation without assuming the +upstream isolated-kernel speedup applies to this server benchmark. + +## Reproduction + +Set `DS4_QWEN38_ARTIFACTS` to the installed artifact directory. Build the release +test executable with `cargo test --release --all-features --bin ds4-server +issue112 --no-run`, then copy the executable reported by Cargo outside `target` +before running it. Run each ignored test in its own serial process under +`target/debug/test-supervisor MEMORY_MIB 60 120 --command TEST_EXECUTABLE FILTER +--ignored --nocapture --test-threads=1`: + +- `issue112_all_kernel_variants` and `issue112_canary_failures`: 4096 MiB. +- `issue112_installed_gate_up`: 16384 MiB. +- `issue112_full_model_state`: 114688 MiB, + `DS4_ISSUE110_DIR=OUTPUT_DIRECTORY`, `MTPLX_GDN_BOUNDARY_TAIL_INTERVAL=0`. +- `issue112_hidden_prefill`: 114688 MiB, + `DS4_ISSUE112_DIR=OUTPUT_DIRECTORY`, `MTPLX_GDN_BOUNDARY_TAIL_INTERVAL=0`. +- `issue112_paired_prefill`: 114688 MiB, + `DS4_ISSUE112_DIR=OUTPUT_DIRECTORY`, optionally tail interval 0; + `DS4_ISSUE112_REPEATS` defaults to 3. Also run a one-repetition full-chunk + control with `MTPLX_MOE_SORTED_GATHER_KERNEL=0`. + +Keep child stdout/stderr separate from the supervisor's resource output to +avoid interleaved JSON writes. Under the isolated MLX 0.32.2 reference Python, +run `tools/issue112-reference.py PINNED_CHECKOUT NATIVE_VARIANT_OUTPUT`, +`tools/issue112-installed-reference.py PINNED_CHECKOUT MODEL_DIR NATIVE_OUTPUT`, +and `tools/issue112-model-reference.py PINNED_CHECKOUT MODEL_DIR NATIVE_DIR +ORACLE_DIR` (add `--hidden` for the hidden-state run; use matching tail policy). +The full-model oracle uses the server's lazy-snapshot policy for cache +fingerprints, matching the native session entry; a deep clone adds zero and +would change negative-zero key bits during measurement itself. + +For the before arm, build commit `8965e77` with only `issue112_bench.rs` and its +`#[cfg(test)] mod issue112_bench;` registration added. Do not use an off-switch +run as the only baseline: the preserved pre-port executable is the baseline. +Both arms use the same test harness. Run timing arms without other builds or +GPU work; correctness checks may run alongside CPU-only compilation. + +## Completion review + +All 72 synthetic and 12 installed projection receipts match guarded stock +and pinned MTPLX; compile/sign-bit/signed-zero failures pass sticky-fallback +checks. All four large-prefix snapshots match #110's pre-port/oracle fixtures. +The 24 release before/after state comparisons and four explicit hidden-state +comparisons are exact. The direct pinned oracle matches all four representative +release states and all four hidden-prefill states, including every cache bit. +The off-switch matches all four baseline states with zero kernel activation. + +DeepSeek's `resident_multi_session_switching_preserves_each_kv_frontier` and +GLM's `glm53_two_row_verifier_restores_recurrent_state` both pass on the preserved +before binary and the final after binary with installed models. Source review +confirms no DS4/GLM model, sampling, cache, shader, or orchestration path changed. +Their DS4 oracle behavior remains assigned to those families; this is the Qwen +MTPLX route port, not a new DS4Server-only feature. Non-NAX predicates are tested; +no physical M1–M4 run is claimed. + +All required commit gates pass: formatting, warning-free Clippy, signed app +bundle, and all-features tests (312 application + 8 tool tests; 234 explicitly +ignored hardware/reference tests). Relevant ignored tests above were run +separately under the resource supervisor. Machine-readable evidence, exact +state fingerprints, gate logs, resource summaries and binary/source provenance +are stored beside this file. No acceptance item is deferred to a stub. diff --git a/docs/issue112-row-map/before-deepseek.log b/docs/issue112-row-map/before-deepseek.log new file mode 100644 index 0000000..e1a81ca --- /dev/null +++ b/docs/issue112-row-map/before-deepseek.log @@ -0,0 +1,10 @@ + +running 1 test +test engine::metal::tests::resident_multi_session_switching_preserves_each_kv_frontier ... ds4: Metal device Apple M5 Max, 128.00 GiB RAM +ds4: Metal 4 tensor API enabled for Tensor kernels +ds4: drift-patch flags hc_stable=on norm_unify=on kv_raw_f32=off rope_exp2_log2=off math_safe=off tensor_matmul=on +ds4: Metal model views created in 2.169 ms, residency requested in 7304.599 ms, warmup 5.656 ms (mapped 82697.67 MiB from offset 5.09 MiB) +ds4: Metal mapped mmaped model as 2 overlapping shared buffers +ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 539 filtered out; finished in 7.89s diff --git a/docs/issue112-row-map/before-glm.log b/docs/issue112-row-map/before-glm.log new file mode 100644 index 0000000..2ec1d39 --- /dev/null +++ b/docs/issue112-row-map/before-glm.log @@ -0,0 +1,11 @@ +ds4: GLM MTP draft 5733 at position 12 in 2.3 ms +verify2 scalar boundary cap=2 cancelled=true passed +verify2 prefill 0 +verify2 prefill 4 +verify2 prefill 8 +verify2 prefill 12 +ds4: GLM MTP draft 5733 at position 12 in 2.4 ms +engine-lifetime counters across new and restored chats passed +ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 539 filtered out; finished in 9.18s diff --git a/docs/issue112-row-map/bundle.log b/docs/issue112-row-map/bundle.log new file mode 100644 index 0000000..98c6b20 --- /dev/null +++ b/docs/issue112-row-map/bundle.log @@ -0,0 +1,8 @@ +cargo build --release --all-targets --all-features + Compiling ds4-server v0.1.0 (/Users/gb/Projects/DS4Server) + Finished `release` profile [optimized] target(s) in 29.05s +warning: the following packages contain code that will be rejected by a future version of Rust: block v0.1.6 +note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 1` +cargo packager --release --formats app +codesign --force --deep --sign - --timestamp=none target/release/DS4Server.app +target/release/DS4Server.app: replacing existing signature diff --git a/docs/issue112-row-map/clippy.log b/docs/issue112-row-map/clippy.log new file mode 100644 index 0000000..1f18065 --- /dev/null +++ b/docs/issue112-row-map/clippy.log @@ -0,0 +1,4 @@ + Checking ds4-server v0.1.0 (/Users/gb/Projects/DS4Server) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.14s +warning: the following packages contain code that will be rejected by a future version of Rust: block v0.1.6 +note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 1` diff --git a/docs/issue112-row-map/deepseek.log b/docs/issue112-row-map/deepseek.log new file mode 100644 index 0000000..a76149e --- /dev/null +++ b/docs/issue112-row-map/deepseek.log @@ -0,0 +1,10 @@ + +running 1 test +test engine::metal::tests::resident_multi_session_switching_preserves_each_kv_frontier ... ds4: Metal device Apple M5 Max, 128.00 GiB RAM +ds4: Metal 4 tensor API enabled for Tensor kernels +ds4: drift-patch flags hc_stable=on norm_unify=on kv_raw_f32=off rope_exp2_log2=off math_safe=off tensor_matmul=on +ds4: Metal model views created in 1.781 ms, residency requested in 8958.289 ms, warmup 2.850 ms (mapped 82697.67 MiB from offset 5.09 MiB) +ds4: Metal mapped mmaped model as 2 overlapping shared buffers +ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 545 filtered out; finished in 9.53s diff --git a/docs/issue112-row-map/fmt.log b/docs/issue112-row-map/fmt.log new file mode 100644 index 0000000..e69de29 diff --git a/docs/issue112-row-map/full-2048-0-cold.json b/docs/issue112-row-map/full-2048-0-cold.json new file mode 100644 index 0000000..8952515 --- /dev/null +++ b/docs/issue112-row-map/full-2048-0-cold.json @@ -0,0 +1 @@ +{"metrics":{"chunk":2048,"rep":0,"phase":"cold","prompt":4096,"cached":0,"ttft_seconds":3.126132542,"prefill_seconds":3.1225067920000003,"prefill_tokens_per_second":1311.766562203846,"elapsed_seconds":3.147092209},"state":{"ids":[9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11],"logits":{"shape":[1,248320],"sha256":"8c75fb4786f06c3b1f26fe08475bb8bfc604289757ba8b622254f8185c7488ee"},"states":[[{"shape":[1,3,10240],"sha256":"c4a174621e892d8a8e0091fa0cb46d331e7d9144c5e3124f1162dddace476dc1"},{"shape":[1,48,128,128],"sha256":"b82f326ea828c1c9a5cbaa18cd1b2b27c3850fa37a1980ec9649f8872534299b"}],[{"shape":[1,3,10240],"sha256":"3e1aedeacdac165abc7e8e5113d0e03f9b53db7fa5ff2f8a65fe6f1a75f5a4d5"},{"shape":[1,48,128,128],"sha256":"d6f75252fdd24addd2f0e5c3d27ad9b95e588c5b4121a32e803a8e474c39b3ca"},{"shape":[1,9,10240],"sha256":"b7a71db806ddab91f435dee12d2f14e7617a428950884e8c68113958fe4c4b74"},{"shape":[1,2],"sha256":"72525c4e77d44f77a83398337fca38babbc3999a8746dafba3abbed7bfbb2346"}],[{"shape":[1,3,10240],"sha256":"f8b319c94933442e8f59ae4d51209a5ac565d4dd00ba0077796a69feb858cd20"},{"shape":[1,48,128,128],"sha256":"886abe3d3e4607f7cb9ffd016a0ca2d2e622d27b4f42f2276aa96fe71452c026"}],[{"shape":[1,2,4097,256],"sha256":"b2d1e817fecd0dcf5db21571722c207c956bd1af5eac0ec060100a654a3a768e"},{"shape":[1,2,4097,256],"sha256":"7c7640d9e7d4287f3f9d79ef876da2a874b5a1d5c3f6310fd3c8648a5b7a9580"},{"shape":[1,4097,128],"sha256":"e23ca99ab44b48202e7be8fb16f9d1b298911af7497a34ff5445b36929e82b4e"},{"shape":[1,1024,128],"sha256":"c2314827c9939f9f8354bc71f1acd1217b386cd858c1daf7c0bc83a34caec9a0"}],[{"shape":[1,3,10240],"sha256":"f44a8d119924e9eb7ba36ed52120b871c0ccc182e5c0c575c7a558104779bccf"},{"shape":[1,48,128,128],"sha256":"6c1173464fdf47bbccb63ebb05525ad630ba879be363bfb7f5db200e3425f8b0"}],[{"shape":[1,3,10240],"sha256":"c520990b6a72ee057479aa0ff130114a4e35a2111d136fdbafccc78197faab5a"},{"shape":[1,48,128,128],"sha256":"e1c90c9f0fdc8765a7c6c95570c29f75129c143c5f99a5f434f4fa2152ce8b12"}],[{"shape":[1,3,10240],"sha256":"918c558822ce7a1d50dfb8e21d0002068f0b4930df5ab67ece83ed436db93708"},{"shape":[1,48,128,128],"sha256":"e4f597f77db4cf1b3abb1c7e4ca53fa899dc455d9fabccc5dd3acf1594c917ec"}],[{"shape":[1,2,4097,256],"sha256":"00dd0d9b039184b66c223f15efdb3afdb6a7cb288d9810d1cb102f8c3b63504c"},{"shape":[1,2,4097,256],"sha256":"a99ef3740356474d34b569dd07f685be90a1f98ccc49b25a71a6df1e1710997e"},{"shape":[1,4097,128],"sha256":"adfa1c162a401e2786bf9c85eed406231306767ff6cbbe1925acd9f9efcc203a"},{"shape":[1,1024,128],"sha256":"c25814ac51ac188632038c00119e16c5270d748ad7e08cd360fd594a8b0b622a"}],[{"shape":[1,3,10240],"sha256":"8d854a92a9ecdce52b5f444034ec884a0bc460e8bcf00b973255b72065badda9"},{"shape":[1,48,128,128],"sha256":"d5ce7a66ec04d6014d4f9ff5ad23bf1609664d49bfa396648cb06ecdca2445da"}],[{"shape":[1,3,10240],"sha256":"99da3387e4b124707ae83ae9128ae11dbf02727498bbca0db0a44ebcfd235326"},{"shape":[1,48,128,128],"sha256":"2b2f993c38737e50460498c793b6adce9cba42ce2ac68912058faed47fdcb32c"}],[{"shape":[1,3,10240],"sha256":"a8556ba528de7075aed04c13b0c1bb022e8fda32b12638f14b07205e037046f0"},{"shape":[1,48,128,128],"sha256":"f8500647d996e8fdf107960ca4bc59a26db09c4150c6918e94ca81447a4be912"}],[{"shape":[1,2,4097,256],"sha256":"bd3b54badf0df2b52bde7a6e6ac8fab808303d774120526ca8aec4c4c1553339"},{"shape":[1,2,4097,256],"sha256":"97e4e4b5e92927273f49fc76b25106a752207c1638807695308f80597b703bc0"},{"shape":[1,4097,128],"sha256":"e1c8c264299410a2f481e361085e9ef7e08682bedd714059036d188e4a4536d2"},{"shape":[1,1024,128],"sha256":"5350fafa2b20211214824a7923ff3bb22a6a8919a63ee77b369a1b7fc7741d94"}],[{"shape":[1,3,10240],"sha256":"a229202754a71c0ce656d9281731c876fc48e414ca773b0101f831a28ce266cb"},{"shape":[1,48,128,128],"sha256":"8f85925cd18edc8a8c5fbec64a4ac88070b8ea51e38797fdda81ec01768c013b"}],[{"shape":[1,3,10240],"sha256":"41c951417ee50ee4bf998bccb66f716a313fde6bf82372b2bf381eef1da2da01"},{"shape":[1,48,128,128],"sha256":"2cbb6cd898dbc72498fec0921c6026e119c17b8b07450efb660186a4448a148b"}],[{"shape":[1,3,10240],"sha256":"e69fcbadbd1e764f0cb2e54c8e434edca0ae4a0ce67e5003bea2efbec56e4e64"},{"shape":[1,48,128,128],"sha256":"3c1f7bb76259ef9cb23cbee3371d009f8b184e7371818cceb8a30282da480895"}],[{"shape":[1,2,4097,256],"sha256":"001c1f6dfeaa198ba2fcbd02784d2c3f4e70a3e48528a21fd2925e66a7f3a1ff"},{"shape":[1,2,4097,256],"sha256":"9174fe8adac692f2f3082d0622029ac098832234f3097fb72c6ba7af7afeb515"},{"shape":[1,4097,128],"sha256":"c4e1c15c8740b7e4751987f36a2f2103183b725132c5b464742096e78a8ce93f"},{"shape":[1,1024,128],"sha256":"e4d165a5ab33c64884e88dd3f489214b2c4630b5b6ace99b62d4f2969d9104e2"}],[{"shape":[1,3,10240],"sha256":"3443384f76a37f910c627472c3f8a4fd7fabd89234e2119b3755debce4de490b"},{"shape":[1,48,128,128],"sha256":"72d5f99170bdde6ad6380371208780d181dd78309e2e41b7d99b03e36a5a591a"}],[{"shape":[1,3,10240],"sha256":"1a99dc486404c8c77767bba0e9f8a4746c8017129ddb1e4ed1cb6b41bf17f8c3"},{"shape":[1,48,128,128],"sha256":"d8b3640b62c5d145fa12394e89e97b24706505cab93f751ed19953a6a4c226b9"}],[{"shape":[1,3,10240],"sha256":"109d1a4b333f324bbdf0c9c041e6197a08e2733524fb58e020cdf47913aa829e"},{"shape":[1,48,128,128],"sha256":"20ba82d506749b0074f4d693adbc5f02ae051e298c6fb30248a2188048fbbf40"}],[{"shape":[1,2,4097,256],"sha256":"0e9ea18d743cb7b805dcdb8cf39c3dbc34f5ef185f1cfa399a9c54b865f9734d"},{"shape":[1,2,4097,256],"sha256":"c992c7bb71da5bc4b599aae03a5d9f8b16c9cc4090e163b368ecd57902da961f"},{"shape":[1,4097,128],"sha256":"ff54715c5f4c885e5b7990d0ceb58dc6736feb829e2ab5d1d8be89632a9995e4"},{"shape":[1,1024,128],"sha256":"14a40697d99ccac2cf3cca991d874cdc5c0db28c17b95e077ba92af8449319e4"}],[{"shape":[1,3,10240],"sha256":"87de5be369a04dc8c09cf7da83ec3eebb6339684c57771ea2a3b3ef55ff92d06"},{"shape":[1,48,128,128],"sha256":"8f563ceae8333c4608ff19eea9b4882b0fe4679190b6f09d3d72e0bb269281db"}],[{"shape":[1,3,10240],"sha256":"dddead58c408cd4b2dec3c596747807aa69ed6eed35cfcdc457e6cea0d0141e6"},{"shape":[1,48,128,128],"sha256":"c977db3ee7cd8d5690bc08693bd821fc4e07d2483a7d0ee45c6cb91ccc5ebce9"}],[{"shape":[1,3,10240],"sha256":"13c32b4485bbe726452426248a75917d0149e1bf36a723e358f2f1816f4e545e"},{"shape":[1,48,128,128],"sha256":"08352b14a131e254122b6ebd7ff624b1c97169430eecfa83b1f0428a977804db"}],[{"shape":[1,2,4097,256],"sha256":"485ef858a3efd6dc374f4a3076d6899a49f820a66f7f44096d69b39b1d5e39af"},{"shape":[1,2,4097,256],"sha256":"d8d191fe20d65d393b4f29b1efa943b9eda5459b3e8f9163136e21641eb9144f"},{"shape":[1,4097,128],"sha256":"31aed1d70b5d020c51bba023a5652e91a0ac0bcaa9b05fc5188adc1f1c42f3f8"},{"shape":[1,1024,128],"sha256":"96827355a5e494a359c629b9fe83aa6053a60b65910ea59ba83765cf4225706d"}],[{"shape":[1,3,10240],"sha256":"067c226cac182024d56ea5ab0fce1b8c83a5002d71bd4701d2882f676c449ad9"},{"shape":[1,48,128,128],"sha256":"9ceab614a1c52f41da65f69adf0fe59e830cbbeae32ca731a465b21ae4b9a555"}],[{"shape":[1,3,10240],"sha256":"20dd65595d3646d978811223a0ec2fae855246edaf2d737de187e9ecc6e1f7e3"},{"shape":[1,48,128,128],"sha256":"0cb4dab780322cbcdafcbf8505109b5b25a8e19595803f8415557ceb79ab0308"}],[{"shape":[1,3,10240],"sha256":"68c29d2e3677eb6eb887d646524229c82d056a928c460f490172addae6e892ab"},{"shape":[1,48,128,128],"sha256":"671a954066a5a30f86f437b67b35debd54fc2bc18a271200f5e42167ef9bec5b"}],[{"shape":[1,2,4097,256],"sha256":"28e2b2d87e0c5ce67f75e0a2beb441bda66379c7b5bb618d0923d989e403e1df"},{"shape":[1,2,4097,256],"sha256":"913dd2f561bbdae9ee20914169406171cccf51d2889555b39c3be2668005d9c8"},{"shape":[1,4097,128],"sha256":"ccfc9bd573e46d80bb01f5ae600221000f672c1a7534793a5d87f94e58294365"},{"shape":[1,1024,128],"sha256":"ab35f9a0876972cf5250149db536a30efb6334b0d51109ab3a6a6323b59d0120"}],[{"shape":[1,3,10240],"sha256":"2705be56bc7e741240731d8d7972d3630cc0436055136d6b4464dc4c2c17ab55"},{"shape":[1,48,128,128],"sha256":"20f259bcdc11c33d4eabaf46bb96d9cae6f5baafb965f6b2777a9d0644fa5737"}],[{"shape":[1,3,10240],"sha256":"0d539d6a43694a097be17e2d1cf0bfadfc7f4abd76a773ae3d1a35b5870252c2"},{"shape":[1,48,128,128],"sha256":"ad287a064ef2d3ca7be78f4bceaf1ccd96dea76f45406fae91bbb6395d02f313"}],[{"shape":[1,3,10240],"sha256":"14719c8dbaa6bedba6c5c769010838e03349ccad2c23cffae28c023933733715"},{"shape":[1,48,128,128],"sha256":"be4f22b62f689d47be6729b5267ffd238bd88733c121592d72f564724054b2fb"}],[{"shape":[1,2,4097,256],"sha256":"c6b7ed08906096e8a27c047eed233c122e39e826808819521d76bb814ca5489c"},{"shape":[1,2,4097,256],"sha256":"cae8e0d6bf8d3f0407e00fa3fd6e56b16e0d2f30131e9cde107472dcb3c8ec6a"},{"shape":[1,4097,128],"sha256":"1feed8bdc0484080f9e15f70054e55138af59cb182556800a460cf7eb40c932f"},{"shape":[1,1024,128],"sha256":"4fea3120106288550f1f4bc8e4755da27d22bd021a3935fbca25c8b5cf653cc0"}],[{"shape":[1,3,10240],"sha256":"e77f6d825aaa96fbd027c017896faf9b9a878f85b4dd1546967a8f76d34d6e49"},{"shape":[1,48,128,128],"sha256":"a62c2850668f0585afb4984b587141dd580681d5b7b1d4de692617cda2dd1071"}],[{"shape":[1,3,10240],"sha256":"bf4cc7f530c08348d9ab776ddb8f8297cbd62709e87d26ee7b1374347d65244d"},{"shape":[1,48,128,128],"sha256":"9a390ff5c94325af85033099743ce9a7ea95703e97bfef74b32f6ac23da1a122"}],[{"shape":[1,3,10240],"sha256":"da065a85126cc05bf9ce37c48d383e65d2461bb40d20d0500b95fdff30163279"},{"shape":[1,48,128,128],"sha256":"450c2aa06c721e2712821d2492c5e3245ddeefde5346497523c359799bd5eda3"}],[{"shape":[1,2,4097,256],"sha256":"f0d3ddf623c760028f45c91b4d6a132ee6f8cae5b60c514aa365ec06f01809c7"},{"shape":[1,2,4097,256],"sha256":"244257bde695e83bd30c3d103103e9914ec80a9043434b1e9b7c1a482aac0bff"},{"shape":[1,4097,128],"sha256":"dc7bceff81867533a8fc5f306eaf89786cdd65bbde74527407f600183cb3624f"},{"shape":[1,1024,128],"sha256":"4a2698473a6c83b472b0eb508cc6b7b5faac50d69758b98fbf7a867a71eeb23f"}],[{"shape":[1,3,10240],"sha256":"e63a2d08c62cdda186456abfd374009786bad6702a78ba8f7d1448e16c12daec"},{"shape":[1,48,128,128],"sha256":"35ebe37c34f342561f283ca8a406adc7de8c1b93bee03126aac2e4c32b7a7064"}],[{"shape":[1,3,10240],"sha256":"831603efb56ddc80a644062d0ce04225ea20906b3041b29a7ea29a01d03e6781"},{"shape":[1,48,128,128],"sha256":"f0b5f90f540c27901e05f2419d656ade1b221ba9dfd77bc1ae09d814ca16849e"}],[{"shape":[1,3,10240],"sha256":"d89032d34523014b736c33a08af37d8c4f3b7a4fe8b0dc0c9bdbb9652bae7491"},{"shape":[1,48,128,128],"sha256":"0de5b1e57796917f2392d8e480ca0b85f62320a2e28297436b5a4fb1f387e3df"}],[{"shape":[1,2,4097,256],"sha256":"8ff2da349580b66eee54d28407c019cbe11087862ba87723e66191b40d26ac53"},{"shape":[1,2,4097,256],"sha256":"b2854981ffb4bb761e236200642bdb199f905dae8fb049eaa33b2b599f6481a8"},{"shape":[1,4097,128],"sha256":"bdf3d6719177f5aa8ad8428a7d88632d98b60c1a3829024c2c3b8cda7a88dced"},{"shape":[1,1024,128],"sha256":"67f9c38880ca277caf78665b3676bfa82560b44fc91355eaad5c87380f365315"}],[{"shape":[1,3,10240],"sha256":"e7f9b7c93538cb1dd70c4f0d7f6ae762e63c6ba2e20bc4f44141b02898a1674f"},{"shape":[1,48,128,128],"sha256":"2967c58a9972687ce9af9e040ad945685cf1175401f9d9ec0271e00a7fa96931"}],[{"shape":[1,3,10240],"sha256":"6995857994589b11bffc7ec9b2435d2302aa44461ddc9a1cda74503bc72fee25"},{"shape":[1,48,128,128],"sha256":"a54554e42489d950f94aa9852ea83ecaa24c925e379af542195b7bc0f5b0b9c7"}],[{"shape":[1,3,10240],"sha256":"a1ebabeb8872784ffc6e1504088843c73d1f4242a7cc40784b694bc4aacd1738"},{"shape":[1,48,128,128],"sha256":"a6ad8bc259110736358fa2dc9fbb6a33b0a7ff3b3bf09542af703fd70cdc762d"}],[{"shape":[1,2,4097,256],"sha256":"902b80a5789ab7706db08f744d75055a79d61c76d7ab074aabfaf099a16b1592"},{"shape":[1,2,4097,256],"sha256":"f76e02be840524442e5d0ad943d304793db4d70d5192f89f3ba8f1ee02780e48"},{"shape":[1,4097,128],"sha256":"dff0222d0de16d702de1b7cc49f067be59e119382723c03bc99c2d2095aa5a39"},{"shape":[1,1024,128],"sha256":"8a79a6508d2d015bb8fd2205c99fbcd21e9956e992894d14bd9ca40914e3531c"}],[{"shape":[1,3,10240],"sha256":"1c9ffc7c735c7398c444cb0841cdbc18bc37be95f77984961491a65ba71521ca"},{"shape":[1,48,128,128],"sha256":"05bc11505a825ff65d9226aadc556b81b8b4b73c56f0b5262bd8d365b26e0d6a"}],[{"shape":[1,3,10240],"sha256":"6a9b272973e97daa76ee7e99187e6b25fcc1ec96b9bb6beeef9f5d57ea356b04"},{"shape":[1,48,128,128],"sha256":"a6847fcfd44dbc5effbbe83734ae9493dc4edb0332dd74755ccf39b328aca1df"}],[{"shape":[1,3,10240],"sha256":"3afacfc236d68969d00a3259b0ac94f218dbf7a980200db8b77650b391000039"},{"shape":[1,48,128,128],"sha256":"7e97cffb1cee34eab5e5491a24bf898f147ab47ff9a9967c4e3ad66af4f6c5a2"}],[{"shape":[1,2,4097,256],"sha256":"3db488dc2a342ff04d0968a12ceb2d8c32ac2211400e5293143f05e1ae008dd6"},{"shape":[1,2,4097,256],"sha256":"d7fb126f89a795571180cc1ceca8b1560b9fe02e6b7d130db1e76742c1c5c16a"},{"shape":[1,4097,128],"sha256":"7de7fb264146847497bec307bbe513d53ebc4e21cca1b84bd9a7e51e214c1bd4"},{"shape":[1,1024,128],"sha256":"ebdc94148c0fbac3af11d9cb188721b5c3b901c2d64c62fded08add6497cdf23"}]]},"hidden":null} \ No newline at end of file diff --git a/docs/issue112-row-map/full-2048-0-warm.json b/docs/issue112-row-map/full-2048-0-warm.json new file mode 100644 index 0000000..aad7d0d --- /dev/null +++ b/docs/issue112-row-map/full-2048-0-warm.json @@ -0,0 +1 @@ +{"metrics":{"chunk":2048,"rep":0,"phase":"warm","prompt":6145,"cached":4097,"ttft_seconds":1.262224125,"prefill_seconds":1.258582084,"prefill_tokens_per_second":1627.2279941337542,"elapsed_seconds":1.282883709},"state":{"ids":[9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264],"logits":{"shape":[1,248320],"sha256":"1c2ae742c82c0272ff438565e08e10f68cf16358e104a30cbdb8e3f90486d006"},"states":[[{"shape":[1,3,10240],"sha256":"746886af843cf362a11582f2cb25d02a0563ea520f9bf8de1c98e403dd3649ec"},{"shape":[1,48,128,128],"sha256":"582b17b914aa942ca5a6d2f4646f062ce5b820d0c9247e96ef4ec22281e49227"}],[{"shape":[1,3,10240],"sha256":"c251df8c285d65490634d8bf47ee416d887cb3f9e597d7c100589697533035f1"},{"shape":[1,48,128,128],"sha256":"17460e9c71a905f4970ca8046e84d0755d42e85f50a0f1936df4f794dadb6bf0"},{"shape":[1,9,10240],"sha256":"06c7dcbb7b1e8c260e2ea0da6b5e9fc69367dc8d480835260a4e31eda8ac624a"},{"shape":[1,2],"sha256":"87920eb6492c98e5514ef95da0027d767cadfab441323f2ed0b4231dfa5a384a"}],[{"shape":[1,3,10240],"sha256":"cc052cbbddd98ebb0e7af81c4d0208c09a4ee03fa2f8cda13f9dd71b29de35ab"},{"shape":[1,48,128,128],"sha256":"481c6c66d7a1b0824597798a81e1658404d1751fc798c3d334016ebef5eaba5c"}],[{"shape":[1,2,6146,256],"sha256":"792079813189bcad9e1576efbdc0a57d4119c4c610c39597e2a92810800e7772"},{"shape":[1,2,6146,256],"sha256":"30059792dae64157d9b865968e732f6605e5d4a6eb1e6f879f5a7bc3ef449ad7"},{"shape":[1,6146,128],"sha256":"14260e8a288c865fbe091e7ca2e7c0a2dde3daccb0be2174f996d29c6675137d"},{"shape":[1,1536,128],"sha256":"4a958ec68d92526a1ed008dd612ad1b470b1f0b9f21cba2eff2aaae5fa313235"}],[{"shape":[1,3,10240],"sha256":"71c09fe9570828d64419efbd9f1e613cd37205ecd83092e19582bf260563d5b6"},{"shape":[1,48,128,128],"sha256":"c152214cb441d8b64ebcd7986ebc549f0a7ea426e2506880a657962f590efd0c"}],[{"shape":[1,3,10240],"sha256":"e222a5e9c563e297884f8686ff52cf7e0414c7e75ac4f35b6129c1a034f7540e"},{"shape":[1,48,128,128],"sha256":"49af07aefe3c5699309744e8a997ed77e82245302cc7dae60a12aee66e39c072"}],[{"shape":[1,3,10240],"sha256":"2f4f815d300b41e8c1fc59f750d641532cea3dbc0af3722cba94bf5dad1a2724"},{"shape":[1,48,128,128],"sha256":"3025387bf30275a5e98127b2396c7cf45c6c6690c2e7a62f601b772ca74cb23c"}],[{"shape":[1,2,6146,256],"sha256":"b1014701366bd60f02dce2a2fac68aa2389d1a0670ba9e52300f839bf078f637"},{"shape":[1,2,6146,256],"sha256":"15b168d772601389a2eecaf2d35d812c5042d81dd7856c74de41f94c45223ed0"},{"shape":[1,6146,128],"sha256":"e6362977eef8633b0863548545c6dc15a84ecf9ec75e15e9cf4f181d5bd3b9be"},{"shape":[1,1536,128],"sha256":"1092b2480b20842843c1a7f1d469b4e796f50001b0072f4859e4b786c1a9585e"}],[{"shape":[1,3,10240],"sha256":"3ae4854978112a80eeafb7a809fb6df42578355664296097058912e7b98be516"},{"shape":[1,48,128,128],"sha256":"0709a6e49877b245296f62fa4504c440d760a1de74c4d97fe76a071c55e1f8d8"}],[{"shape":[1,3,10240],"sha256":"9de362c68c3417225d69210f383647816827ad1a70940ea83c0fcb14b116c5af"},{"shape":[1,48,128,128],"sha256":"13db955a691bc1b086148090807705f628ab65a023f4f5c8c8d360c59fddcba9"}],[{"shape":[1,3,10240],"sha256":"460d7191611b2cac3f7156c7753293c380f12be562f23a0a3ac78e59fb893e9b"},{"shape":[1,48,128,128],"sha256":"f7f25d212f5d8c8fa4959077034fe7d61586e9bd6e995a843c636923a1cb8983"}],[{"shape":[1,2,6146,256],"sha256":"4e32c4c94490683d9e2b3d768189954a4a667633282c97f9ba3cf787119fcd2b"},{"shape":[1,2,6146,256],"sha256":"eb01e37443eef80c44ddcdb85159be25209162f7ea30cda43fd6d465dd157cd0"},{"shape":[1,6146,128],"sha256":"ce247d91f2ad126fa52c7ff8737d5d9cefaffed8d95f598a3c2c7e5384a334a6"},{"shape":[1,1536,128],"sha256":"d0453cad452b9784e03b81462b4e46b9c374409611c055931c45e9b795954884"}],[{"shape":[1,3,10240],"sha256":"725fd1eee1acbbd35ed8890ff6d39e86976f7d73cefc210daef166ec52bb2802"},{"shape":[1,48,128,128],"sha256":"7174c1784d1b2c3f9902bebd26bfc954533667cd5711452d4dcefbced501d3bd"}],[{"shape":[1,3,10240],"sha256":"4bb8972b89d8f61cbecf1a4b8d6f8037d5a6a5319d426e9bcc9daef793293228"},{"shape":[1,48,128,128],"sha256":"62e8e35dfb63ac36bf8ac0a27869dba29faf7200a514385921a6ccc514c9664b"}],[{"shape":[1,3,10240],"sha256":"e8e527ad0b1ec5a80f3da92a35e794945642f8ede66516d4eff486b0204aa69d"},{"shape":[1,48,128,128],"sha256":"9f26a18ca9046575585430405dbedd2bed7e647094125e128396727c5ab64fa5"}],[{"shape":[1,2,6146,256],"sha256":"781a3500ac0f47595eeb10457dcce5b94062db5e43357eecec9f2feb02db746f"},{"shape":[1,2,6146,256],"sha256":"22d073aaa164d3923194e378bde867c4ced8af332c30622453de4750026752df"},{"shape":[1,6146,128],"sha256":"274bc6f452155254638d26513496c363910a9c77d7dd47f7283f5ffb0ead5fc0"},{"shape":[1,1536,128],"sha256":"73fc53d61e2db29c4cc7b447439efc780399945a328e3e9ca2b7a94be31ef65d"}],[{"shape":[1,3,10240],"sha256":"3fde72809c8ba47595512bbc144cb8ee9b3d14cc37f9b7414431de9f9f8a3519"},{"shape":[1,48,128,128],"sha256":"a9df3d8712ae13dc9958e9ad9dbd14ebcbaac0ed99d1c34c5ecfbd3690460899"}],[{"shape":[1,3,10240],"sha256":"8347eff20eb38fe4f2d9a7c0630c9d3352ff57bf27bf53b8ba89500022f5d68a"},{"shape":[1,48,128,128],"sha256":"05eb34744117de7e050efe31cd19306e900a1c5345fb6566a2b18f649eadc371"}],[{"shape":[1,3,10240],"sha256":"b4684873c0af8ca4aae2cde1a3c5c10d6e582f4e3e47562e5464aa07f39c59eb"},{"shape":[1,48,128,128],"sha256":"43e561098e33b6b7bf1748dcdb3ee35ccfc930cf56d5b998e9bf15065230979c"}],[{"shape":[1,2,6146,256],"sha256":"8d09b714a924ab0e6e55a4d1708d156d8dc776e38a2b797555c2ae4b7d8ed914"},{"shape":[1,2,6146,256],"sha256":"3a18920bf3875449c4876606a738098513ff4e951968a517c37ad412baaeccb9"},{"shape":[1,6146,128],"sha256":"8801f87d8cec0973a39c8c2f2322a7292b358f889c4d74ceab47901b33083d30"},{"shape":[1,1536,128],"sha256":"933b79975aefd2c34edbac1b35c22f01a4d296c4c25b9676ab6c261044b88c18"}],[{"shape":[1,3,10240],"sha256":"3561fd8eb313b271e84cbc64a637f9b3f2035e73d80d76d58cb15dfdcc492391"},{"shape":[1,48,128,128],"sha256":"0f084fd5ccc7d633bf493135e5e90e49b32ddf6f7c0cfae32f1920be2eca6e21"}],[{"shape":[1,3,10240],"sha256":"a7b3898f52824e3993ff80751f095214d028c05628b0724c171e2b768a12c836"},{"shape":[1,48,128,128],"sha256":"1b5f61c07b39038b323a75e6dd66d15809b28182431dc8b7e08a972e2eca9c8f"}],[{"shape":[1,3,10240],"sha256":"93deee98a3c5c8820a3e88346a17fb80669a8692f812f72b93219cd6ab16eb7d"},{"shape":[1,48,128,128],"sha256":"7dad7c8915d096747a6d47dfd6b95ca01e399d0d4331b6d55981c72d2aba4c00"}],[{"shape":[1,2,6146,256],"sha256":"a99c34e6b9c154f5f3bf8deb09da537d09f32cfe4f8452440f392df9e4ac9be6"},{"shape":[1,2,6146,256],"sha256":"013ff0abfb4c0cee6ffa5768f01279ce67e6c97bb729837ab6eea44f08c03a27"},{"shape":[1,6146,128],"sha256":"f4a3bfc6839d158c46410b14a881cff9330da72a0e0a8cfbd242fcd15af193d1"},{"shape":[1,1536,128],"sha256":"8207f161cc72af6b31321e66e81aeeae91fd3ff6666ce18ce2ebfd7a592a12f7"}],[{"shape":[1,3,10240],"sha256":"44abd8e46e43948cf6d9d71f77cc30603d3c965a5a90d101d60438f1b4645997"},{"shape":[1,48,128,128],"sha256":"521465372021935c7e2ca4a036dbe355fbb7ec78b6753a10309aae360a519326"}],[{"shape":[1,3,10240],"sha256":"6a8c6358ff52596793c2c7f1e5620be32e5192ea236ee73e62734b7629e02aa2"},{"shape":[1,48,128,128],"sha256":"dac86bb49106921f63eb14dbeb6299d0032d8495054147e84ca3d213d3857454"}],[{"shape":[1,3,10240],"sha256":"735dde5e97698b81fd1dc3f2f1ae762b8154ba8452736fc1cb62cdeed52938ce"},{"shape":[1,48,128,128],"sha256":"e0ba196ba54e6835b89b731800d794234060ea23b2bea8bda9a49abc9ea68278"}],[{"shape":[1,2,6146,256],"sha256":"e04e178c12492980f0c588c8449f8a35697166283e9693f4875fae6c628e8197"},{"shape":[1,2,6146,256],"sha256":"89ccbc53a261c07f34731be311fe17cfec11eb2800368fde6326f812344c4c83"},{"shape":[1,6146,128],"sha256":"ebe2545dd3e11343231e48ae276aef073362824d544591b655fb2d05a45f38f7"},{"shape":[1,1536,128],"sha256":"348c0df9578efb3d2404e88d4fd0cb3d3354c97b59b1350929c2a5c5db89f5a6"}],[{"shape":[1,3,10240],"sha256":"20852eaa1f118a8173cff0d3cc11fd64c0e53c68c358c79be5d576e1c5777d6a"},{"shape":[1,48,128,128],"sha256":"381dd5df207f43454afb9f34347129c0ac8b3cc752fcf61d34ee65568f676b4d"}],[{"shape":[1,3,10240],"sha256":"83582aa56e9eb07ed824ca0baca5f2f16929222e165108f6841b5268695fa767"},{"shape":[1,48,128,128],"sha256":"7b0e3f33b9eadcf04e8fb515a0d58e8b0e8afe3ae2c4b7c82dbb9b52faf2a6e9"}],[{"shape":[1,3,10240],"sha256":"ded0c76802d27f3160086e819db0c0141d56d7a6cdec1ea3351e915a5568c031"},{"shape":[1,48,128,128],"sha256":"3737c18b0d725ef788e95585498c530fd207abfd185ce4029d23cbe4d768bd43"}],[{"shape":[1,2,6146,256],"sha256":"c6acbe46ee2b8617624a437a2931b41c3f7dedc7faba714952d42a9af42f3591"},{"shape":[1,2,6146,256],"sha256":"4e97084949b3278eb29c3c28010f917d54496ce0d8be0e44e7f0e45cc039db53"},{"shape":[1,6146,128],"sha256":"b6dcf92c1edc2b54fbc9e471c5f48c1f468ff56890673cabb6a0b7fb1838f592"},{"shape":[1,1536,128],"sha256":"e9a69bf183c45cde613d0212ad1eed5b12accea5f5c193d1c364f8908dd5b7d1"}],[{"shape":[1,3,10240],"sha256":"1f4ab563dcbf0b2e6f407e011dcdd914a67611c4b35f3d5ac62a17df31c030d4"},{"shape":[1,48,128,128],"sha256":"697d610171d20628c51becfc736588da1103fe501a279d02eacd0844f04f930c"}],[{"shape":[1,3,10240],"sha256":"cddf6d2d4ac23f12b8ad75ff30a731753a8a705561b99827e25f0029bc533c27"},{"shape":[1,48,128,128],"sha256":"ca75987caf4d6d9923fd5abd8d601e98e36da31effd863b48a97bc45da97665c"}],[{"shape":[1,3,10240],"sha256":"4b6a9f81166bd5ebe24cc3cb5d4b3858929af736b2f4acc382b21a32633c7c6f"},{"shape":[1,48,128,128],"sha256":"5f2eab35faa4da819127724de596f021b7c4ec6404e7d160684fc176f1e36cdb"}],[{"shape":[1,2,6146,256],"sha256":"078a24ba017c2b283061994c42a85eb81b8bf6afe419e5eff9b36cf217fd211c"},{"shape":[1,2,6146,256],"sha256":"fa83a841a3764740426b2c08942f83614d14186d5c92523cbb352890382adc24"},{"shape":[1,6146,128],"sha256":"6982f830d9f2c60b62c7a4f35d0a18f20a9fcde23b1f61b51772c1fbbadd954f"},{"shape":[1,1536,128],"sha256":"4ec9fc8bec011a3b2f66bfa10e000306507c7ffc73db8745dab4791e0e1720ff"}],[{"shape":[1,3,10240],"sha256":"c6f279df21c2c737f5801a19dd13b9603ea803ecb1acd98c3622e6d93294d512"},{"shape":[1,48,128,128],"sha256":"5b0fc6f96f9778fda1f4a13e3511395f456d0a79936c8229b5a1bf28663927be"}],[{"shape":[1,3,10240],"sha256":"e4fd8c59314f3f15fe4eb5367fd1c5ca242bb05023bc0f69b7b36714c49975b4"},{"shape":[1,48,128,128],"sha256":"83b65bd648f6c8ea6fc6119cb5b3de9ddc1167cd4cf867963ab0a6f1b1d06d5e"}],[{"shape":[1,3,10240],"sha256":"a05eaf24d9d48ec93a1cad7cd244df962fb4fbccddb9565d11edf00f6f6b56c3"},{"shape":[1,48,128,128],"sha256":"0080a4bd4c20d6ff9f3b130071615dbdd2a4357d1d375a7ba50be4facd7b5af7"}],[{"shape":[1,2,6146,256],"sha256":"17a9b4470f6d1b4db899f11efebe3f310c236843d7e8594e924e7e22b3191c72"},{"shape":[1,2,6146,256],"sha256":"56c27bd3384aa5e1d06984a76771258035727a76806c6ebfce5ff173919be856"},{"shape":[1,6146,128],"sha256":"4bbd504f720f262ef244a65c1e6bddad60eaf42b78169ddd548d8535a7beb182"},{"shape":[1,1536,128],"sha256":"f8158ac491f5147092bf18e4655289d63ce83c93f059cda968274a139cd85a08"}],[{"shape":[1,3,10240],"sha256":"22a17a8fb4feb3d24af28693b38ee86256489b626a587b750fa30e9ba58192ee"},{"shape":[1,48,128,128],"sha256":"f7da9fb39072dada5a2e9d2a070c4d4ef60395c9e01842808dc3d28dca434713"}],[{"shape":[1,3,10240],"sha256":"c9eb4ceb88df2b339fec61f4e2834bc8839331df60607bbe4f7b4fd94e6aafd1"},{"shape":[1,48,128,128],"sha256":"5a1a56b46628c3e53b878a7308672ccb452a22758cdd445ceba022c563640bf1"}],[{"shape":[1,3,10240],"sha256":"33f57ad772399eeac8cc763e508acc33c6d8c31f487ffc00cde70b808780d3f4"},{"shape":[1,48,128,128],"sha256":"b4750a7a8f8786edbda43e3be67b724c62aec20ae8eaf71a89ed5d00a69aa29d"}],[{"shape":[1,2,6146,256],"sha256":"3f31bea78d17233e0bc6bdc6dcb8285bf36c8a0af2ba967361670b6189ef43e0"},{"shape":[1,2,6146,256],"sha256":"279a7838eb93ec4fdd99483603f4407657b7a9368c393c240bffcbed63baedcc"},{"shape":[1,6146,128],"sha256":"a6e77499b3c93991c019ed7a3ea9625adbe112c760bc35165fce97d37282f8de"},{"shape":[1,1536,128],"sha256":"22bfd14696bcc68c5ddab210847746fd4e926a86079f4d0855e0202048f84673"}],[{"shape":[1,3,10240],"sha256":"b4a1a9af0e7863d1ff545e5643c78228217fa30e2a7020719d7b42d1c351fb47"},{"shape":[1,48,128,128],"sha256":"a3e8ac8113df3447ecdfd38948bde4b8508f8ebfae2f6df0a8452d97d83c336a"}],[{"shape":[1,3,10240],"sha256":"f9dc06811c51d2c36920953ed1dd225ed40815c264f126b27ba544b5111814d4"},{"shape":[1,48,128,128],"sha256":"f19d750ded440d78a5e594324b85df5f30e33cd1872960677ede2fa10b41a613"}],[{"shape":[1,3,10240],"sha256":"eb232ea03409a184636140e7ddb615e2720009fcfbf6317a4e9762eb95a6df2c"},{"shape":[1,48,128,128],"sha256":"d8a6c81fb723ecc72d180b9ba729021067ace124c294dd9e95f547ba2dd551e5"}],[{"shape":[1,2,6146,256],"sha256":"d747732784d59b0856d7e477e4fbb69c8dea5bb6050e4371283d11d41f8aaf23"},{"shape":[1,2,6146,256],"sha256":"49389351569ba97a42ec7048c40d9775e9bc28b1e9715f93a28567914b5f36c6"},{"shape":[1,6146,128],"sha256":"7c3505334eb48dd21c4e9a0979e94276a434663a85ccdc668b6863ec8c71b9c3"},{"shape":[1,1536,128],"sha256":"b3334b67c588c05444d986df5e15b092b77726234b9b7e61681288f7588b7c9b"}]]},"hidden":null} \ No newline at end of file diff --git a/docs/issue112-row-map/full-4096-0-cold.json b/docs/issue112-row-map/full-4096-0-cold.json new file mode 100644 index 0000000..6a646b9 --- /dev/null +++ b/docs/issue112-row-map/full-4096-0-cold.json @@ -0,0 +1 @@ +{"metrics":{"chunk":4096,"rep":0,"phase":"cold","prompt":4096,"cached":0,"ttft_seconds":2.955218083,"prefill_seconds":2.9541866239999997,"prefill_tokens_per_second":1386.50685326507,"elapsed_seconds":2.9757388750000002},"state":{"ids":[9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11],"logits":{"shape":[1,248320],"sha256":"597ee91801d46667a2cdede6f46b13e97e5c5c90e47e3536363f6e98b80f7727"},"states":[[{"shape":[1,3,10240],"sha256":"c4a174621e892d8a8e0091fa0cb46d331e7d9144c5e3124f1162dddace476dc1"},{"shape":[1,48,128,128],"sha256":"4fc827c2c426b1d3e0d15b8eb4b9ee065ca895f9ed8ed5bd4e7a48bbe53a8ae5"}],[{"shape":[1,3,10240],"sha256":"52924550b26ae25bdfaed2be54f0d4b4ee627a97b88e21f4c5e97a52c9c37770"},{"shape":[1,48,128,128],"sha256":"b969175c90627b26066f16815d690459db55f1e69686e79c00092dabaa68e853"},{"shape":[1,9,10240],"sha256":"14d172a2ac14d51c87e6a6d29c4173080678fab3dd55f9e975e03c8bdfc13324"},{"shape":[1,2],"sha256":"72525c4e77d44f77a83398337fca38babbc3999a8746dafba3abbed7bfbb2346"}],[{"shape":[1,3,10240],"sha256":"3e823bb74ddada7a4eb23de2251b6eb8475152ab971d3a052fe97a88c520d9c3"},{"shape":[1,48,128,128],"sha256":"c1aa00dc11b5bf6c26497ef38be921b365ece4a2775891f43f813b3db765a22b"}],[{"shape":[1,2,4097,256],"sha256":"325419d39ba137e571b1ea9fa95aceabbe0392d7ba7156750d051d13e376ad79"},{"shape":[1,2,4097,256],"sha256":"b594af423c07ab23be81f8f07b2c5798ee6887d39c21e90eed3d0f4f0fc0cc77"},{"shape":[1,4097,128],"sha256":"c49685d09f63b32f7c91744a008df5e14a666b95f35fbf8e0349d2ea63ce9fb6"},{"shape":[1,1024,128],"sha256":"d3b55837a3505c0ea97d7330b377304cf6cb4b2b3a75a4d7c1d8c24b8d6dab91"}],[{"shape":[1,3,10240],"sha256":"607a79fcea6b11a6c6768db97ef8d0f845c4c9147c86c3723811b35f63187b6c"},{"shape":[1,48,128,128],"sha256":"2e6ee3e9140901ccd48c52f20b241619a4e1ffac810d27497c90a46486a23a2c"}],[{"shape":[1,3,10240],"sha256":"73fc735a808555a86f59e1868c850092b90d41e56796dc3e8cff7411321d0ee3"},{"shape":[1,48,128,128],"sha256":"7628f5ff464a515f5054322ca0b95916d31524e77e917f669d551d38621edd78"}],[{"shape":[1,3,10240],"sha256":"e90466557fe3e92584f246c70f500ee1dde5d4561ffd3b1a6dfdc83a850eabb0"},{"shape":[1,48,128,128],"sha256":"5955776b079e7ef0cf18e54623c39cf1c1ab96cc315caee2670e407f13ba49b1"}],[{"shape":[1,2,4097,256],"sha256":"2b529d546c8a5a1b07fa6e203cf1cf2c6285ddf4641fbe51c50fd2062151033e"},{"shape":[1,2,4097,256],"sha256":"4915097e556c0c772cae48a7edd3412375c7383ef8f43e0de4acbdf91b30c8a5"},{"shape":[1,4097,128],"sha256":"332cbadd1a74ef896a987be59cebf50ef9fbda33466c244beb2e31bfe0d06346"},{"shape":[1,1024,128],"sha256":"c4237f24bc2949d1e26f2ee99ffbc63b72dc697c1f08eafd850c6140a9e358b6"}],[{"shape":[1,3,10240],"sha256":"734ab06b7c3b67885a8f30c204989a416a33ba055edbf0bb32455a7306e80f4c"},{"shape":[1,48,128,128],"sha256":"a5f12d905cf598d22f76a1242d1614f181300b26bace0ce829d10a1fc8de7361"}],[{"shape":[1,3,10240],"sha256":"ec9a894ad889523c5cebdfc991775379e31d14d22a17a6fc423bf49b9dcbadab"},{"shape":[1,48,128,128],"sha256":"e74a6c630c69ab80184c6d400b6aab01ac503585df35f15768f18be078346e5d"}],[{"shape":[1,3,10240],"sha256":"ac016d1ab1e02cfffe19283940e9067a5a0aa6e5994969e9d39462a80493eb82"},{"shape":[1,48,128,128],"sha256":"c55bed4592a6b6c67ee2c0c8839fabd685419b64033d68c83d249fd4e72f5d3a"}],[{"shape":[1,2,4097,256],"sha256":"e853f016e59fa16606922b1b64ad2b54db9c57e48b3b17b125d986814e13a9f8"},{"shape":[1,2,4097,256],"sha256":"c82158fafbfd0a505607f88d5d7a00e21bfbcd542497ac79ec90062d24efc456"},{"shape":[1,4097,128],"sha256":"46d0b58826b63fecc23c95a043943d54829255f75437872157654329fa784ca9"},{"shape":[1,1024,128],"sha256":"0e9f8776a574c03001d3ee31cbd3f33fe7970994f4481ec015f67b9947286775"}],[{"shape":[1,3,10240],"sha256":"6d6db16041afe7effb96357d018f6dcb0ff467ac6379672ec9770b3e2c0f123f"},{"shape":[1,48,128,128],"sha256":"43bdec6e4da6de78b12f7a2d88c33312caad5117eb57f48a829e9fb09175d3b6"}],[{"shape":[1,3,10240],"sha256":"ff83c3ae7481522be0e80bc687795c519eb4433d1ce1982c057b0dce882fe491"},{"shape":[1,48,128,128],"sha256":"08bbfe0baebe58ee54b0512ce6acfcc437c146db5a91d016a406995a6f5dfbb5"}],[{"shape":[1,3,10240],"sha256":"e3d00386f23dbca3f0cf5bfceecb566e8dd167ee3091d7885751b8663e39e3a4"},{"shape":[1,48,128,128],"sha256":"235807ef3ff88e022c0b2f43a9f3bca82727227e0dadc3086ed1f9781eb3ee9b"}],[{"shape":[1,2,4097,256],"sha256":"ff4a88750d3c95454b33b0b705c569370139cf76cc852e788a4d03ba295477f8"},{"shape":[1,2,4097,256],"sha256":"ddc0118f45e7a8dc5bc8df76c65d81c6bb362ee03955a7b4b2a5e98605e8c084"},{"shape":[1,4097,128],"sha256":"00f0320a14b0e1f2ce81107ec6f39e99f592b3d15b72876cdd2d693ac5ca54e7"},{"shape":[1,1024,128],"sha256":"6f4cabbec07fb712c5b6a34d08c4caca58a72d9b655a2af8f6b40fb513740c22"}],[{"shape":[1,3,10240],"sha256":"39f79a467950d40243f284144335ad218b62b423b74bd0466aa46cd87e627987"},{"shape":[1,48,128,128],"sha256":"6639ebe547430585ca42706be49e9e412905bf45aaf6d5f1f75bda5656f33a8f"}],[{"shape":[1,3,10240],"sha256":"c9c9092f27a977cdb2c2d77ef8dfb86879851de1e9125aaa40f16e81f3054d97"},{"shape":[1,48,128,128],"sha256":"4cb25d5d355feeaae5631f6697ac371433df6152df1e4a8fcf1b09ff5d5e7b7a"}],[{"shape":[1,3,10240],"sha256":"59580f8ded8da949a940916e2799809757faddfd601a04408ddf85a85978cc22"},{"shape":[1,48,128,128],"sha256":"14271e9e7b55c22529dbb95c7866d34550fb04ccc909ed137477f60aa7a05bc6"}],[{"shape":[1,2,4097,256],"sha256":"d8dff5ff7653242f5fb2b4ce0fc51267e1250ccf85ecd56ff0611fa3988cf11b"},{"shape":[1,2,4097,256],"sha256":"c16f0cf9939298f8b379c6292cbbda694401bab0916b2d1afdcc3ed5ab84f993"},{"shape":[1,4097,128],"sha256":"73a9345a4bb6691ad8aa9cbcf954082a15adf49140a63e352d171b186404de9f"},{"shape":[1,1024,128],"sha256":"7e9608e3a9e38a881bed9959c73b6c81fa7a8a2d3ef564676d12b82b8929d2e6"}],[{"shape":[1,3,10240],"sha256":"956b9c77074a9596f7a625f0c4813b76f759032f7a4030ef7a1c7559646f6a7e"},{"shape":[1,48,128,128],"sha256":"de5e646434cf7a6a1a095e8cda3f2a5e5451c92d9246e7b4b79a7aa6f37992ff"}],[{"shape":[1,3,10240],"sha256":"55620f058c3e9bcca862c2bc4c7dfc24682e8539fbe5f9ce3c53b608fa6ebd71"},{"shape":[1,48,128,128],"sha256":"86f85d3ad605af396ff112b685b492033b489e65e68f9f69ad8be7b67eaa89dc"}],[{"shape":[1,3,10240],"sha256":"3564135ac320e1b998ef24d1a19837482c7b60f8b321d7b61d1df1b9592f12ef"},{"shape":[1,48,128,128],"sha256":"ee6b9a7bf36a5525e1adc93f9aa866763c39d6cb859da5af92fd6e95291214a2"}],[{"shape":[1,2,4097,256],"sha256":"b3a7ebf9c3f8a1ed255982e866f29b9b4a8936b6e5c764df40d78de431d4b2f7"},{"shape":[1,2,4097,256],"sha256":"cb269e54021244b9668aa3a5dfdb6081d83282ea940b6270990dffcc2bb60d71"},{"shape":[1,4097,128],"sha256":"4ba73ab9d03212c8f919b66f4308a5776a4eedf646c40207cdc18b3b47378825"},{"shape":[1,1024,128],"sha256":"1148587bfa30ecc950ce576d45cdbf75dd74bed96113c837e521f295f11ce629"}],[{"shape":[1,3,10240],"sha256":"193b0ef47af4437c2df3e93dbaa503b3eb9f675bdde2de99cb7425cdc038a747"},{"shape":[1,48,128,128],"sha256":"abe9fa16f03c0e10e40ea66043695a43cb1663c8a211b7af3f8ece004c5d5f65"}],[{"shape":[1,3,10240],"sha256":"422f4b1a64adca3f356cdeb512307b13aa468e235ecbf16e19010968884404fa"},{"shape":[1,48,128,128],"sha256":"0d0d06f847794601fefa3ec33bcc7fb1bf6b47e97281e973f4e5ace3a9ed8d40"}],[{"shape":[1,3,10240],"sha256":"c47751326e28ba6053c79810ead8175edcc4cd1725d2080ac413a150e8505188"},{"shape":[1,48,128,128],"sha256":"43e0d909ffb6fc384a0942501287d62e96d5e32491bfe6164f4b74c926ca221a"}],[{"shape":[1,2,4097,256],"sha256":"2bc62e44ba2699b92ebe19cf5c86f702620714ea5fa5c919739a1bd79542def5"},{"shape":[1,2,4097,256],"sha256":"cd5977139fa7458577fe68b13c1d17f9879a3400d1db21443f0121b768966ec5"},{"shape":[1,4097,128],"sha256":"0d67685292f29de149ae9bc6e0a2a2a90866c62d2d9500ca5b7da589817f7884"},{"shape":[1,1024,128],"sha256":"83b7679548b1b0c02f834d4ac7caee87ed34aa258f0a6cb74c44d663acf539ff"}],[{"shape":[1,3,10240],"sha256":"75e036e6b295c395499c952cc854b2a551bddc1aae826d37e1593e28e78a92d1"},{"shape":[1,48,128,128],"sha256":"17c57e6fbb045689c033b5c8264b6a6aaceaee80da8a86eb159f9d673a0c911f"}],[{"shape":[1,3,10240],"sha256":"59686823911d9313f2957cd0b621678a485a26ab616c7288c5dd8b0d88f8e959"},{"shape":[1,48,128,128],"sha256":"9fc8c3a7536393779d0cfe7fea6f2e7bc48fe82359443850788305bf07999744"}],[{"shape":[1,3,10240],"sha256":"a45d1716efe6748de5f246a186c99c37bb8e267e67f6de185c1e98d0a5b042df"},{"shape":[1,48,128,128],"sha256":"cd84182cb8ee13e157c553b9eb621cd2d0f8616b40ebce2647435c22bdac2e54"}],[{"shape":[1,2,4097,256],"sha256":"9b8b070e0a466823af4ba0c6877ff115328e8c2e88e2d2f4db0f6e3e6d72f5f8"},{"shape":[1,2,4097,256],"sha256":"5dce913feec9d3da64a00426dd99787b29ed86f42234e072190c6c2ee1562c91"},{"shape":[1,4097,128],"sha256":"76613b60a1549e0fbce63a669d08a157be83c0b56338c08cb344654a50a8a204"},{"shape":[1,1024,128],"sha256":"8aec51748ed1f27aaf73e181ce0b7599089c3593de47a8c2038b972b56cbde40"}],[{"shape":[1,3,10240],"sha256":"9c1641d3fa42bcb6ce146ca24bb0c34d0c4682e10d886072fdf395f185baa86a"},{"shape":[1,48,128,128],"sha256":"0c3104fb6b998c17dd2f8f69b1e60165db5236b90551374f6ff3c67a7725026c"}],[{"shape":[1,3,10240],"sha256":"b4ddb59f68216c077882ad16c96b86f677beb9c60cb7e1b56ee706885672d5ef"},{"shape":[1,48,128,128],"sha256":"11544c86f50f6990b7a53daf937d3054f37318eccbcab92ba8662c5664bcb0e7"}],[{"shape":[1,3,10240],"sha256":"1b6411862f35bb72f5f878259a59b6682e9919c285ea6a2bfcb2a172ea751eb8"},{"shape":[1,48,128,128],"sha256":"00ffd09305f11b862d88e8a7c2fe759cff6a76be1593b42138daaf0b1a6fa694"}],[{"shape":[1,2,4097,256],"sha256":"de1f8ff539ae68143435d52964721b65c6a57fcddc400c59e3c6a56dda02e44e"},{"shape":[1,2,4097,256],"sha256":"d55ed8078adc82c67d7e15a31b1e8fda44a1c66ec0c9831b7b15d6c352a04e38"},{"shape":[1,4097,128],"sha256":"b085ef0b12a1d806f5f1255d699c667b28d22e11eea900814512be742c2903fd"},{"shape":[1,1024,128],"sha256":"842d23ec91f817ab388514a28aa198aa9613f0bbc438d2ffad5d967d7e0dc153"}],[{"shape":[1,3,10240],"sha256":"601fbc1db1a7838e941dee2e4f674a8db35292e083a07d007439f961a7d744e4"},{"shape":[1,48,128,128],"sha256":"19c2fe4e0b6d1bb6182f97e46e8f3ecc60488003a4aa98ac766e2adc4ad7e49e"}],[{"shape":[1,3,10240],"sha256":"1fc57944d1600a9d4baea124e1659a52f79c992c90c09ae0b311dc34f5076467"},{"shape":[1,48,128,128],"sha256":"ee025173bc3ea31466cb7287c5fdb94995f7131d19289dae55a3d74339f44b72"}],[{"shape":[1,3,10240],"sha256":"5b1351477e344a3cfafd5d7d04c47824f4d80051dc25d965217d279a8444bb3e"},{"shape":[1,48,128,128],"sha256":"9e869e98169d2e8054423c93a30ab6b87f606fea9e9e5bf2f806107bad8c6c68"}],[{"shape":[1,2,4097,256],"sha256":"202be4bf8410e6c8336b84c084366cabf0dd41ffb0bfe7c0fe1aa51cd0842ac3"},{"shape":[1,2,4097,256],"sha256":"829d71dea97c68a9b115031eee9621ad17188ec6324f3b8aec66d905751d4e06"},{"shape":[1,4097,128],"sha256":"4ebcd347d21284064ecf4d3a97fbc49ecd46466c0ac1e22c55257c2682646ff7"},{"shape":[1,1024,128],"sha256":"68f5d6c1d7e268d44e2ec7fdc6ddf32a08480470885bb555fe3dac6e06abedde"}],[{"shape":[1,3,10240],"sha256":"8a63753db8872c471e35a96ac94e1028459a677e1ae900361da9b4f1be21d7d7"},{"shape":[1,48,128,128],"sha256":"f362a2df86e6e9cb08dd72544590689772250228c7b4dcf6057785731b9b2475"}],[{"shape":[1,3,10240],"sha256":"fff34ef9f26e495b52f631957fec6c3e0018467036d23a63688c0c81a85296f1"},{"shape":[1,48,128,128],"sha256":"944df04ea8270aa6f91916b2988e7afab7853dbbbca5e5aee74ccc7ec95ad633"}],[{"shape":[1,3,10240],"sha256":"387e489c4f8a43570bcddd5493e99ee6a894d57ba99d2688a3ee51209a00e5cc"},{"shape":[1,48,128,128],"sha256":"a517885b5d66237fcac52ec0233863e5805d435eb4e5e7d4fbb233300fb6c6df"}],[{"shape":[1,2,4097,256],"sha256":"a772cad18f492e696f0849acaa7fd48f4d424d11216bfba6fb4d3ed646977063"},{"shape":[1,2,4097,256],"sha256":"75d90f33b3864783587a6cd68d7f82542a10224c4d8761125b4bac85e4e3208b"},{"shape":[1,4097,128],"sha256":"8c477c40858f08c85fcc2a363631393c9c6ad5e55dc284b4df0e73b47dc921a1"},{"shape":[1,1024,128],"sha256":"5f6d6c1b283d5da27234f908842fa88361ae6b1d67d728cf95665f3eb616539d"}],[{"shape":[1,3,10240],"sha256":"0d06372d91350d8f49016419d9d9a07b9086ed9df367a94c647a8fb1970ad60b"},{"shape":[1,48,128,128],"sha256":"22504e68e0aa283b310bbdffffd03f151137a0516d3416b30bac94573978ef84"}],[{"shape":[1,3,10240],"sha256":"f7c024d0851d8573f7cb36ffa0c4c0929529b502e1f97806ab172f41898011e4"},{"shape":[1,48,128,128],"sha256":"35b8e9c1f16abf59b13720dbb370530027e117f78a613aac9c0202157296b3f2"}],[{"shape":[1,3,10240],"sha256":"77e031c1b31b651983e3ab94b130731fdfe2000bbc826f4dbed1906b6864e0b9"},{"shape":[1,48,128,128],"sha256":"7a91dc89944005c7b93e904e32dc83088eaaffc95fabb8f10ad317a8bc1e999c"}],[{"shape":[1,2,4097,256],"sha256":"01b7030092b6246221fe200e6eb57408b510e5ea6347bff740cef11c97e25443"},{"shape":[1,2,4097,256],"sha256":"557bdcb4a21f3c9d2fd8f0788df390e3368ebf2dec05b2359de87fe04c40a918"},{"shape":[1,4097,128],"sha256":"0f027425ab1576c41347a920f8062a242719d021d3a5f0bbc5d60094fbdccf82"},{"shape":[1,1024,128],"sha256":"433699f4a0b21abae389eb373958bd2e3ae36cc1c80b68c0696e92a986028046"}]]},"hidden":null} \ No newline at end of file diff --git a/docs/issue112-row-map/full-4096-0-warm.json b/docs/issue112-row-map/full-4096-0-warm.json new file mode 100644 index 0000000..5c699cc --- /dev/null +++ b/docs/issue112-row-map/full-4096-0-warm.json @@ -0,0 +1 @@ +{"metrics":{"chunk":4096,"rep":0,"phase":"warm","prompt":6145,"cached":4097,"ttft_seconds":1.606924,"prefill_seconds":1.6059842079999997,"prefill_tokens_per_second":1275.2304722538095,"elapsed_seconds":1.62792175},"state":{"ids":[9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264],"logits":{"shape":[1,248320],"sha256":"6cbb0dd0746cb79f6c6548be4cf42558c96438f1db818ee0f31e73c07a88e262"},"states":[[{"shape":[1,3,10240],"sha256":"746886af843cf362a11582f2cb25d02a0563ea520f9bf8de1c98e403dd3649ec"},{"shape":[1,48,128,128],"sha256":"7cd3b33b0296516613bfd51acc31eed5fc6a3eeb72e076cd44b0b0d9636cd659"}],[{"shape":[1,3,10240],"sha256":"73503517adff5b36232feda5703e6180b7f4a165bfe1ba7ab7125d0d1df0a4b6"},{"shape":[1,48,128,128],"sha256":"32197f61a67d0ab2b42fef8b6ee31a92089ea07ecbe4aaf3a16d2ef1d92f4cbb"},{"shape":[1,9,10240],"sha256":"6e903170929a3d21b7209b7c0997651067b2e4749f5dedb144e6a348dd1abc6c"},{"shape":[1,2],"sha256":"87920eb6492c98e5514ef95da0027d767cadfab441323f2ed0b4231dfa5a384a"}],[{"shape":[1,3,10240],"sha256":"d8109be454f67c131cae1c896586a9e80aedec65d0b8a25377bbcd2f3113d99b"},{"shape":[1,48,128,128],"sha256":"3476716673ce9801b52f4ba0aa384c414e6c25a6aad7bde69613b4bea3d11a54"}],[{"shape":[1,2,6146,256],"sha256":"331b8e9b58d17a4612c54c6fd40353ed0e8f5af3c154e8afcf027d981c97db1d"},{"shape":[1,2,6146,256],"sha256":"d61513f8e1f7a21cd5e58dddd516bfce0d530a95b08c4cb9b0a8cdd9a808dab4"},{"shape":[1,6146,128],"sha256":"7b8cd3c67d1188dac12eb425ef32964c1ca33986b061ddc7591266a7f05bb033"},{"shape":[1,1536,128],"sha256":"38a99f07c2fdb5e971186dfbaf8c072f51ea0f0ed6ce44b0d2af37b4f68e77e0"}],[{"shape":[1,3,10240],"sha256":"ac2594cf480b44b3a045538e38b9890aec6c87a335e3aed7ab6640787f070f82"},{"shape":[1,48,128,128],"sha256":"4ee0ebcfc57448ff903e1a68c70f85be9800dba5baa5f485f0370b84d186b15b"}],[{"shape":[1,3,10240],"sha256":"5619dc028a2f7758d070c1ab49988b5de5ccb9d9341c9503cd2a15f468639af0"},{"shape":[1,48,128,128],"sha256":"2eb84f4045d00ffcd69434eea9f6102c9be47303e0a47388d94215229745170e"}],[{"shape":[1,3,10240],"sha256":"42ba9153ee4f81c983fa2f98712e8facd51a6e685b17217935d5c9ab63cbdf83"},{"shape":[1,48,128,128],"sha256":"a520cd7b7e0b5ffcc729cef29b0679407b46341a112226af6eb238c4d5bc095f"}],[{"shape":[1,2,6146,256],"sha256":"9a8c72370e493b82b40d25dfdcee660420c64a5e5148ab5c7aa962318b6042f0"},{"shape":[1,2,6146,256],"sha256":"f6fb63cbe6930f23c03add8aeacf585a36ff03dc2a09b99b3abfd8041ec985bf"},{"shape":[1,6146,128],"sha256":"6186480ade1e33e9dbb00f365e3c4df8efb2c79b5f5a7f286336d6da6eb862fd"},{"shape":[1,1536,128],"sha256":"7c9a748693852a9e88019d4d1f081bb7616600664b9e59737d05e4f9caf7108a"}],[{"shape":[1,3,10240],"sha256":"ae569861378262ed140049f54973bc3335af0598ac73c9bdcd12c13a8fcf9174"},{"shape":[1,48,128,128],"sha256":"7f1507ce764b773d16ba0ad18d34df7d7a695c679f3e4476da300a6af50c3da1"}],[{"shape":[1,3,10240],"sha256":"1f6ec4922262cd8b7ab0d260db2b8ced112e7ef92b4988d290e354ab597c84eb"},{"shape":[1,48,128,128],"sha256":"1d895061adff5322eddfd083b1d209723ea3806adaed8d1283fb6da3a1477e12"}],[{"shape":[1,3,10240],"sha256":"c65e82d409286f827d5c0dcb801d4be2c93f8c57e002e3d5e7e1270934a5482d"},{"shape":[1,48,128,128],"sha256":"a45de6ca0ee7d75653d2436fbf9b4f06a10fa6b7485c81219c66517a2e349f16"}],[{"shape":[1,2,6146,256],"sha256":"a59ccc2badad7dc14f8243d9278016c3c606df8fb292b6445bbb06bc2d75f583"},{"shape":[1,2,6146,256],"sha256":"c5b3c83e5f71eb61c6a7d34831e9caabd34282d51bd8ca7a0b8faa2430e3fb24"},{"shape":[1,6146,128],"sha256":"11ed83d7fdfb049a95d01bdc6f3bc7e2bd18f68b9103a9a51dbfe20148f14e25"},{"shape":[1,1536,128],"sha256":"ddd538636842d530d3f3ba74ce97341a2b8e8158b95e975338149e65b995ccb2"}],[{"shape":[1,3,10240],"sha256":"931f556b865805372be0746dc86259e538175923f660922b462fca431dd44f58"},{"shape":[1,48,128,128],"sha256":"ccf934fd89480e71794eb517ddda68827d44501987c5c8411f5947087623cf51"}],[{"shape":[1,3,10240],"sha256":"6ea7300bc6f4000d0043b7777f4627e137c8e728ccc64e998c5aa7297efbe3ad"},{"shape":[1,48,128,128],"sha256":"3f03f10b31dc7121bda4fb7f023b61574d8fbf05734c339e79f0fa61bcafd079"}],[{"shape":[1,3,10240],"sha256":"53b2ed3725e436ea93645e7e29332d3aff2ed11694b6e36d64c4c682a1ded4e6"},{"shape":[1,48,128,128],"sha256":"71f7f861ec015243872f7b91bd6d021a051ff55d53cf6172a6f1e54b1cf80db7"}],[{"shape":[1,2,6146,256],"sha256":"a90f1b73292396ba5b7fd9ff7f0d1fd68183a6eac5993c1688971db2c4f2b12a"},{"shape":[1,2,6146,256],"sha256":"c87a2e278dbdce758db62714c02ab7f74dddda6e622d6ec054743ad88b8c70c4"},{"shape":[1,6146,128],"sha256":"56b41e2b4e30355e69de4f718266483949d21a27d22fef08fe54742ce8203d47"},{"shape":[1,1536,128],"sha256":"06cb81ad8e42315439e5499fcece6da76dfb7b41addcd2f5eebb0694310beaea"}],[{"shape":[1,3,10240],"sha256":"21cfda4d3b129cf9ade58803e57e9e89a87df120e2db4d3a7ed4413da8c90669"},{"shape":[1,48,128,128],"sha256":"db2495281c0acf0cdc382b65d4f980a43fa5254793c27a0a960513663e480f17"}],[{"shape":[1,3,10240],"sha256":"4275d02c23c7a22e695dec8fbf00300abb424eabb44ae8dc8a35b1b7cfaefbf8"},{"shape":[1,48,128,128],"sha256":"d82fe03106a9ba1449f6ace645986f3623bf45e707662b860fdfa75d35310773"}],[{"shape":[1,3,10240],"sha256":"320f02eb259b14fb99dcf66fb26d2c5401c9a9382e2844c8bf6ba0c5f391ea90"},{"shape":[1,48,128,128],"sha256":"54de21e911e7e9529793702acb2e914ba89190c579a97bdd92732cc50a693850"}],[{"shape":[1,2,6146,256],"sha256":"eb5c586bb1163835564c4158962e8331c1f643e64d717bfad3d1abdf14704938"},{"shape":[1,2,6146,256],"sha256":"ada968425cfcac271f70d24f853adf8e8f4ed87e7a3bb9b86b1d6882c407101c"},{"shape":[1,6146,128],"sha256":"4dd8540ad1ed250f9f88f3dd29bfea945a868648be884ca26bb9f46fb6742856"},{"shape":[1,1536,128],"sha256":"fb78af1aad7c63fb30b568a09b1f537c8688405d9728f664b26e495036033e07"}],[{"shape":[1,3,10240],"sha256":"7971aa2bd6660e5f595e756f2efa29a09ee58b621f4b2c6de96b24a3886f9caf"},{"shape":[1,48,128,128],"sha256":"9e5ec54d1f8c440c4f6b3ba991b81f8f5e9c364271ebfd08b041aed0890a4ffb"}],[{"shape":[1,3,10240],"sha256":"af4aee7f4a5c7378bb82e0182d56d6957e0ed314a14349081b68ce7e4bf9ebca"},{"shape":[1,48,128,128],"sha256":"0b7c7984e9334ab57deaab449ffd70765e7d180c8cddf3eba5f7f40d5dcfddb7"}],[{"shape":[1,3,10240],"sha256":"485eb5eb4082b5f50320e25c66878f82b4bae94244dde990bbf675401fd06d7e"},{"shape":[1,48,128,128],"sha256":"da584eae21c38e62d900fee8313043e806a4c159caefa17bf025a2469c2e4979"}],[{"shape":[1,2,6146,256],"sha256":"09229af540c3bac91122c718db1efdac4a9bf68527c3f8bcbaf41717593232a9"},{"shape":[1,2,6146,256],"sha256":"d6a46d6191398dc54e836a0b552881e31d8454102ac446eed7d875f80f57ddf2"},{"shape":[1,6146,128],"sha256":"321dace934db8ca07c3b2e1d39182cfb705b4ee5f1c91f21b6f54818def2efce"},{"shape":[1,1536,128],"sha256":"47bcc08f59b31e930ae80d3f3607bc30f374503799b9dd7ea6dbae2c0c5ff471"}],[{"shape":[1,3,10240],"sha256":"34e120df945023c6bfa3e3be27838cfcffc4204be8ad453df91d3e5c0bcfa02b"},{"shape":[1,48,128,128],"sha256":"af2740f3908659ac9e7b2596928c4e61555d28bfdf07e5769e3070a1ba1d67a5"}],[{"shape":[1,3,10240],"sha256":"538138433cc08483adbbaea72a3208003930e3271cdc063d30bd2d64aa9e3412"},{"shape":[1,48,128,128],"sha256":"e132ec9d96ac087acce81bee878632ea93c55e9474f45b4d087b9d1d60508f1c"}],[{"shape":[1,3,10240],"sha256":"921e0ebeded08cc3f231961bf4613f5f19c4cc7b5f573bb41e061072c8b360da"},{"shape":[1,48,128,128],"sha256":"ab4d78429581af88875a94792e76ed279a7783ec920bd43553cdc5f0905df529"}],[{"shape":[1,2,6146,256],"sha256":"c5e8a34469eac23f7beed0361c671894a81615fda1819576b2e8e5c568d511e7"},{"shape":[1,2,6146,256],"sha256":"853b304bde1253f1eb9659d6dc2a739aa26fc2bf14b11eebf93584dba2b34d24"},{"shape":[1,6146,128],"sha256":"ab16e38ac30f224b2dbfd9546fbc43330eb485fdaa24d610d4828dc692a10f29"},{"shape":[1,1536,128],"sha256":"66e030d8c3f906a02d28c68ddc505b6a6f1ddbbbcf24b2588c211382ca25eda5"}],[{"shape":[1,3,10240],"sha256":"b50974d8afa79eea7d8a879c2deba2f758acf4d4c3a4b5401ddf7b6ed5bd6fe0"},{"shape":[1,48,128,128],"sha256":"d3634104898619676d6676a451ba12ef0547a4ab1e3ae70d128012b1fcfc4912"}],[{"shape":[1,3,10240],"sha256":"8f8c7a37899dfad21c375da25f036d6e7f18c97acb6c566a63debb6a0ff1535a"},{"shape":[1,48,128,128],"sha256":"908d2a0711161e1dda2b21b8175f07699e3f7bd460e82860b24ca1636bf8ee7c"}],[{"shape":[1,3,10240],"sha256":"c6f6781ec9346ddcf5ef94b19fa0125261bcc83f6951206b0cb2a3d427fdd343"},{"shape":[1,48,128,128],"sha256":"7cb71798dc24111c96deebf3b4e5ac095bbccd40aca6e1d8c91ef7a252819b25"}],[{"shape":[1,2,6146,256],"sha256":"de1a4beb1339e310a8816cc0beff796678e0f5ba9b3416e61f8468c35f79be28"},{"shape":[1,2,6146,256],"sha256":"c45b1560c919f148acbee9617142847d840c6bb2a0b204d077055954efae97f1"},{"shape":[1,6146,128],"sha256":"8c32eaffeb5abefd6015bb28e7a2f67dbaaea712c83008ee7e3b998b02009203"},{"shape":[1,1536,128],"sha256":"17b8a56072b602616dcb38ac0565eee1ded59fba588c4071fdcaa30565f58b20"}],[{"shape":[1,3,10240],"sha256":"f99dcc40f587a3bfd2f4d2a94cb91132ebb1c4e3811f091598ba26dc221af794"},{"shape":[1,48,128,128],"sha256":"55763b3284bb8d3d45ab4f3569e270834017cf13af8a8982affcaaed844d2a01"}],[{"shape":[1,3,10240],"sha256":"8aafb9937b9cf22f5edf42b213cc6d5d13bede71f4d1832ec4e45785a178ce81"},{"shape":[1,48,128,128],"sha256":"1af136c8848ede17f81ee1f77d891fb2f8113811045cb61cbfd625912252ff8d"}],[{"shape":[1,3,10240],"sha256":"49c2a6f63b2a224c0b50f7f8598d36159e13ac7d27c29577ed91b7c2f06fa2ca"},{"shape":[1,48,128,128],"sha256":"9754efb72911eaa8f5c99323ab7da99b4e881695492f4cb76b6daf20e31884d3"}],[{"shape":[1,2,6146,256],"sha256":"a1d303d762bf3bd1c41c553e9ba492f56fc0439aa5a3980aecaabe13e4cad322"},{"shape":[1,2,6146,256],"sha256":"0b8e58900256daf169e931434af4e95644e8f320bf53bff2780f2c8c4c6376bf"},{"shape":[1,6146,128],"sha256":"e7ecd22d9d0c8f3c606dfac54bd94498e2a4444e4c6aae2822162d5365e2ef63"},{"shape":[1,1536,128],"sha256":"61d310e1259c9e876a030774d41553375b92e6669cf90ef1c0306fcf9966f08d"}],[{"shape":[1,3,10240],"sha256":"fb6250f161d56191d3f9ede620017868d166673f823cde928aedc2bfad697af5"},{"shape":[1,48,128,128],"sha256":"3918b6582374b2ca85ef281a0c8a5da357ac37ef1c4260709db6fc55a9145a5e"}],[{"shape":[1,3,10240],"sha256":"d77a9b251d3c65637498653cfaed76cd79be3da10e53e666cc265ed6108fcaa9"},{"shape":[1,48,128,128],"sha256":"d9dddc969fd53bfc28b16369e94bf9ac38093c8cb29f7d6bd1f3b731862af87d"}],[{"shape":[1,3,10240],"sha256":"6bc296879c8799e77d91a9b900cc21f4958e099af78514660fb63fd85fee40d6"},{"shape":[1,48,128,128],"sha256":"edcb94751813ed01c84e09fe76e8ab3ad329c63d0e88e8814dbaecfe1a739c30"}],[{"shape":[1,2,6146,256],"sha256":"6d78623caa2edfed23d07afa227c802f6f16e21eaa16d6566ab6d96adf8299a9"},{"shape":[1,2,6146,256],"sha256":"2b437acf8b4d42de6af7c1571e73b0bba4ee4e0fa20e31e4a73719f63e30ae43"},{"shape":[1,6146,128],"sha256":"804f5c6f7919d0f152db7f788e4aa6156611b7dbf9a08b8210cffd4e89bb2ae0"},{"shape":[1,1536,128],"sha256":"929a95e916ad5099c210401b6d6163f569cd4be3926aff40610f56bf1dfe4e46"}],[{"shape":[1,3,10240],"sha256":"a04a5887af6d52f55773dc4e2e562bfcaa166aec5f0dbd126c43098a44dc2943"},{"shape":[1,48,128,128],"sha256":"af2c4e7d7fc63b27425a50369b1eabe5a94f8d449b47699781a19704d077e2cb"}],[{"shape":[1,3,10240],"sha256":"19017e653e105f519106fc02d7f46941c56ce18bf779aeceb998c4bdb071b808"},{"shape":[1,48,128,128],"sha256":"6913ca9f896af8f70dcc50eeb837e21c0f59b5dc640d32b1a54f6dd0332a4ed2"}],[{"shape":[1,3,10240],"sha256":"76a9a70b18a602704dcd9e325864095b27af4944c4ba7795e5069f2ea780d183"},{"shape":[1,48,128,128],"sha256":"5546136fb6b490549366f04a8390721e8f8c84668ab0d033bac8ef7b7820e0d5"}],[{"shape":[1,2,6146,256],"sha256":"4e0b41b9e789a29973ca84c98d25dd85e9cb19a0010733e66fe87462bfe3c2ab"},{"shape":[1,2,6146,256],"sha256":"3a0d5d2b4555854e111f462db2a34f0b0bd8b5ee1134afce5b53f860a4791431"},{"shape":[1,6146,128],"sha256":"41be136ad40d43ab5956f106fc1817ed4da32f572fd6731f8770719e2412ea17"},{"shape":[1,1536,128],"sha256":"c35d41a3c507c40fa6687434c393660855e89e54279e266001b7b7e92ccd2f92"}],[{"shape":[1,3,10240],"sha256":"2e675482a14af0908a3a0e14d5b4ff642584db849204e44e87c041924d47a5d0"},{"shape":[1,48,128,128],"sha256":"b93a9a432302258a5e863f09333090a338955456476562f6f85bb1271a6cf848"}],[{"shape":[1,3,10240],"sha256":"e1c97ed60915914561f0ed31c66964d52fb15c743263c55df99f182030991395"},{"shape":[1,48,128,128],"sha256":"9410624854eadb13966bdc333f14a348642c7a4d58b582a92c9e85fee8e6147e"}],[{"shape":[1,3,10240],"sha256":"0b99ad901218fb9297c8e58aadbd302a12d39cfbcc4483819a6c7deaff993647"},{"shape":[1,48,128,128],"sha256":"aecf78686b90a9ca69349b03b425d3a2ea6e64f030186365019419aded70ea42"}],[{"shape":[1,2,6146,256],"sha256":"3e932581dba8487b894a2d35e680f17fc1dc3bb5ef3d7e29ae3696dd1198d1fc"},{"shape":[1,2,6146,256],"sha256":"b6fbdb6990b2ecd9d3095b1eff3a230e22f0892e59fd94bf43e0f75183984e05"},{"shape":[1,6146,128],"sha256":"c12a1e865bf473ee62d81049734929f4f05f57859afa6e2940b827279b800a0d"},{"shape":[1,1536,128],"sha256":"5e6154d244740894cbbc1c36198216cba02d819be0b685e2ef6803ad3361f1cd"}]]},"hidden":null} \ No newline at end of file diff --git a/docs/issue112-row-map/glm.log b/docs/issue112-row-map/glm.log new file mode 100644 index 0000000..67c534b --- /dev/null +++ b/docs/issue112-row-map/glm.log @@ -0,0 +1,11 @@ +ds4: GLM MTP draft 5733 at position 12 in 2.3 ms +verify2 scalar boundary cap=2 cancelled=true passed +verify2 prefill 0 +verify2 prefill 4 +verify2 prefill 8 +verify2 prefill 12 +ds4: GLM MTP draft 5733 at position 12 in 2.4 ms +engine-lifetime counters across new and restored chats passed +ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 545 filtered out; finished in 11.86s diff --git a/docs/issue112-row-map/hidden-2048-cold.json b/docs/issue112-row-map/hidden-2048-cold.json new file mode 100644 index 0000000..81d3955 --- /dev/null +++ b/docs/issue112-row-map/hidden-2048-cold.json @@ -0,0 +1 @@ +{"case":"hidden_prefill","chunk":2048,"phase":"cold","cached":0,"state":{"ids":[9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707],"logits":{"shape":[1,248320],"sha256":"af470b0d6bb4c39264b9218ac9d6bd4698840732f03a34c9e018db317b48dedc"},"states":[[{"shape":[1,3,10240],"sha256":"a2101c1d71d0ba0c07481c6afea3358b198fbc3132d6442a0f8e532ea8f6e9ac"},{"shape":[1,48,128,128],"sha256":"f24a008de319ea930d6d76b5db206f6a2e573924e0621104183167023f140096"}],[{"shape":[1,3,10240],"sha256":"23b35a2760ad523fca9a8d33b189004514cd5c9f5917407aad65bec6c35b197f"},{"shape":[1,48,128,128],"sha256":"bd03a74e7a63f5dd2cd9bf89c82cb7f65886c0864ef243961220625149e776c1"},{"shape":[1,9,10240],"sha256":"c86694500ec6fc81bfafbf201fee526150bf878980f19c500c7b6db9ad190631"},{"shape":[1,2],"sha256":"8d0969fc231ab5877e0d06c555f460351e3affb6e1ca632a833406bf6f7bc15c"}],[{"shape":[1,3,10240],"sha256":"a7f1d8f1d89b6790b10bc4adad9f769b67b5c3cf0e1d508bacc9bca59c7c6ece"},{"shape":[1,48,128,128],"sha256":"40c6373b09194cc316c08d022050db36034907b3252d172f73b39852920ae62c"}],[{"shape":[1,2,4096,256],"sha256":"15ae669b0202bb04249e3ea7a24228e973f5429c66b3b237142fba949464c1c8"},{"shape":[1,2,4096,256],"sha256":"915656cc3b6ad3f43c80e6661fa8c70bbcca87a901190c932c19ea11b4b66ef1"},{"shape":[1,4096,128],"sha256":"724997152243627b01677ba4b11e506ccd79a319009ef21145f1002401f79817"},{"shape":[1,1024,128],"sha256":"c2314827c9939f9f8354bc71f1acd1217b386cd858c1daf7c0bc83a34caec9a0"}],[{"shape":[1,3,10240],"sha256":"64aa0682775dc0a0ca59524336c3b37ae032f017b983af6598903895bcebf7f4"},{"shape":[1,48,128,128],"sha256":"6845e087f75e8e96a52b8ff5c90be18913e5ed541a3a100e4b5136861b42e883"}],[{"shape":[1,3,10240],"sha256":"07955fce732d7c04799c8d82a6718309743214ff118be3c2129ed72fdf625040"},{"shape":[1,48,128,128],"sha256":"acb496049049dff9a5279d7d714dcb7ca88bff253abff83b41a2ac0349bbed54"}],[{"shape":[1,3,10240],"sha256":"a97d8e1dc078c15382ce6b2ff64e432d182dbfe186990daa0be1c6dbbda9fe70"},{"shape":[1,48,128,128],"sha256":"8063df93e9eea6bc1074a741fb1acde0ca9cb26a9a12007c17aa286cc0d59b5f"}],[{"shape":[1,2,4096,256],"sha256":"160ac3becaf423c78f5a37f75bef2d461687131b79b7f55e3014f330712f6f04"},{"shape":[1,2,4096,256],"sha256":"98f8da8c337264783e9c47891b1bd505d37ffa94dd081c8c667e360b4de9677a"},{"shape":[1,4096,128],"sha256":"57b6c2674ffb784d35f9f6ccca905b002de36d5bf23d69aec6c5b84a5580028d"},{"shape":[1,1024,128],"sha256":"c25814ac51ac188632038c00119e16c5270d748ad7e08cd360fd594a8b0b622a"}],[{"shape":[1,3,10240],"sha256":"f282608c55ed49b224ae7ac473a32e895f326ec927eb4f46809cc8fde956c8e5"},{"shape":[1,48,128,128],"sha256":"007eb0dec923556fa6c860eae79a382affed7cfa3ec2b11df5082cfa6183cf89"}],[{"shape":[1,3,10240],"sha256":"4a876874e85cde0e3becdbc950785ce69883d31e9eabfb9a3a49fcc4ee703a39"},{"shape":[1,48,128,128],"sha256":"ed7165d114d0cae65974116ae3cbec2c79f8d7bf14e20d6ff93efbff2813fe2d"}],[{"shape":[1,3,10240],"sha256":"fcb2beba6e811ca9311829b98874c17534700358bf8eec5d13f824324405d345"},{"shape":[1,48,128,128],"sha256":"7b2bf4b4133cbb42dc299e71ddf0c55dd8faabb5c661e0e52fae286e71c4ccdf"}],[{"shape":[1,2,4096,256],"sha256":"4c293940883c55e432d7fb10f092b541542217b412437d447386a586302f08b8"},{"shape":[1,2,4096,256],"sha256":"523470f1c64538f0015e6414af7befd01a77a9ae999b25193b270020babb61c7"},{"shape":[1,4096,128],"sha256":"5c5811743f9b7a105a9728f948364d4265e8b4c0d412e36c24a68f3d3d13b5f4"},{"shape":[1,1024,128],"sha256":"5350fafa2b20211214824a7923ff3bb22a6a8919a63ee77b369a1b7fc7741d94"}],[{"shape":[1,3,10240],"sha256":"342d00d34c48ef5ebf265479b29ba7be550870d296aa734dd6713c0e2b86f19b"},{"shape":[1,48,128,128],"sha256":"c20eff099b8f23689520be6d6b21c68ce0490b416f0e24ea5a24ad83f1b64f7b"}],[{"shape":[1,3,10240],"sha256":"373ecbea953341c23571f959f668ed358af6fdd2e13200761a71a1fc9c01c601"},{"shape":[1,48,128,128],"sha256":"077db74353b52429acac6561d7db69ab8f323e5cd73359d18da07b4da8e28053"}],[{"shape":[1,3,10240],"sha256":"f9917838281a45034a6bc00cd635c1cf6d33510c74d6339a90f8c676a183cf3c"},{"shape":[1,48,128,128],"sha256":"b7e8354301d67dc285bb5b52c168588b7aa5da6d02d625ec165aee3dac0b9464"}],[{"shape":[1,2,4096,256],"sha256":"c22e046843354162ccbbf72025dcc61e8e83eb80389b3c47a7e2443ba96989e1"},{"shape":[1,2,4096,256],"sha256":"5b201bc8e2e6bb3ab24ba17d463f8badfa845dea03f7cbb6c6fda407266f2d10"},{"shape":[1,4096,128],"sha256":"7b16b14d786398f560b1cc22a3d9f629077e273fd2e0bb185087662e015ff248"},{"shape":[1,1024,128],"sha256":"e4d165a5ab33c64884e88dd3f489214b2c4630b5b6ace99b62d4f2969d9104e2"}],[{"shape":[1,3,10240],"sha256":"174880b6c33894f4058daf51eaf8b187115a30131cab336b09bcd55f8588a583"},{"shape":[1,48,128,128],"sha256":"ba872999eb5ebaed457bcc824753668234f91ace6eb99d2d77e0fb72ac92130d"}],[{"shape":[1,3,10240],"sha256":"7e39bb6f103f4350d911f0750069cd0203dce6992ebb2a9757fb2db725082dd6"},{"shape":[1,48,128,128],"sha256":"d5fbeb9026dec346fe8696ce0acd6ea40302fc053d43dd30cd815327686677fb"}],[{"shape":[1,3,10240],"sha256":"ae0911ce2881ebe7048ab0695a491056928efee123e795b4af2a2b8e1d0e490e"},{"shape":[1,48,128,128],"sha256":"728ab223d51ddc577c29a9e7b5a3f9fd5073f109bbaa07a844a74dd36e58a47c"}],[{"shape":[1,2,4096,256],"sha256":"dd319a0ed4944a88cd6d9bd1985dc7b5e9295e2a52defafd93485ad556bb11c1"},{"shape":[1,2,4096,256],"sha256":"a4787f59d54b5efdf82a6662a0d9fcb7e27add91706784066efe947037c31930"},{"shape":[1,4096,128],"sha256":"3af43d7088bb93483d727feeb06000f102b0a566350c42451746ed6e62476c44"},{"shape":[1,1024,128],"sha256":"14a40697d99ccac2cf3cca991d874cdc5c0db28c17b95e077ba92af8449319e4"}],[{"shape":[1,3,10240],"sha256":"c4725b90f386aaeb2cac4015cf5f0d5de16ca1422f519d6f9d1d2fbdfe0a3f24"},{"shape":[1,48,128,128],"sha256":"cbdb95e83cc37dfeccadee5d6e1cabd6053017f412d8e410f85e6ca433715d49"}],[{"shape":[1,3,10240],"sha256":"649f04dc0a8ded4ff4bbe76516588f8e35802caad13b79513cba04c1f9a43294"},{"shape":[1,48,128,128],"sha256":"c79cb2a393dbf41fb08288208fc39a91cac5fe78ebd84ff92a22210ccd783317"}],[{"shape":[1,3,10240],"sha256":"a0b3196f3af47ecf5a50979f56ebd1dce991d50675f3ac0b0fb0683bf4904ab0"},{"shape":[1,48,128,128],"sha256":"3291436a4cffec52aac61d166781302630649b04bcc3f683249fa8141d5e9567"}],[{"shape":[1,2,4096,256],"sha256":"a239e82f38b60e3a80afb214c56a82ba2a3f8648d445b7831ddb33e1c36fc50a"},{"shape":[1,2,4096,256],"sha256":"c398f20a3317267609a5fc27f2a8da2eee4aa1364d187ee3922ca3133ea7a7ff"},{"shape":[1,4096,128],"sha256":"aae1ee7ca09b9b3b74e25ec5098c3fa0e0a0d87234a452a60ac4b5f77d5e39ce"},{"shape":[1,1024,128],"sha256":"96827355a5e494a359c629b9fe83aa6053a60b65910ea59ba83765cf4225706d"}],[{"shape":[1,3,10240],"sha256":"961738cb5e562a54c0d06a44e6182d3963b73de49b3c4ff47c315251f5e8d2be"},{"shape":[1,48,128,128],"sha256":"f3afd5d7b5c68ece8a93678f76bcf2dea98541f018e16f7f276065792fef5e37"}],[{"shape":[1,3,10240],"sha256":"5171dc3c636cea6791675982bdd80eacad97d69357dc1e0a9fed4c5c73fba022"},{"shape":[1,48,128,128],"sha256":"8986cc0f1c72a30b7c0be70194c0c4946b22c0e3eef4e47aca34877bcb80dc2d"}],[{"shape":[1,3,10240],"sha256":"761002ba7d1e3d3a93ac0feaae86e19d3cdad4cd51bb3cf66717290459ca3317"},{"shape":[1,48,128,128],"sha256":"0bfd83f32d3adbefd864f8ab53880124e4f8c50273cd67843a103f38c4f48575"}],[{"shape":[1,2,4096,256],"sha256":"9e99ec9b6c0c7389459c0fc8f425d7bc246a4e202601fdf85397039b9489c52f"},{"shape":[1,2,4096,256],"sha256":"21630cb0e98e6172836566d13352e4815a15f807b78f2057acb682506c4a6129"},{"shape":[1,4096,128],"sha256":"31966520cc2d9918b6b3708f21ff8e38a2d99fd9d1eedd7fe92aaf1bd52f5165"},{"shape":[1,1024,128],"sha256":"ab35f9a0876972cf5250149db536a30efb6334b0d51109ab3a6a6323b59d0120"}],[{"shape":[1,3,10240],"sha256":"8d660f9043fafb517083649ae00c19e078572c83feb19d52b3b1e6dced9dc191"},{"shape":[1,48,128,128],"sha256":"ca03cd62fed0284ded3a509311a7490678768315589e38d2501cd97199452f83"}],[{"shape":[1,3,10240],"sha256":"ff0c9c694b5cc630476f147ff882ddd95f1fa8c4d5e442d2a3ba9d7bc1f99a97"},{"shape":[1,48,128,128],"sha256":"4280e0f27ff04eaab90b5b57f2574df086c4ec28f8605f6204aa80e6bc42adb8"}],[{"shape":[1,3,10240],"sha256":"b60c5756974a78bd83da7b360f31263365b251b325a338e718367b2cbeca9aea"},{"shape":[1,48,128,128],"sha256":"55a5151be35f6830fa5343e68b258abf1df9988a9f17e1effd77b395cecbc146"}],[{"shape":[1,2,4096,256],"sha256":"a615c1e909874fd8f94ed77f6abfc3888fe7f2927ece0dd13a320d18bd86ec9e"},{"shape":[1,2,4096,256],"sha256":"c985626bd6dace21bbe5e86c636f9eeb1ab78b199f7e005799d554f1186f340b"},{"shape":[1,4096,128],"sha256":"5b0a4bd4a5342674ea525d444d5cdbb5395a0e48676940490220ee27231a7d5e"},{"shape":[1,1024,128],"sha256":"4fea3120106288550f1f4bc8e4755da27d22bd021a3935fbca25c8b5cf653cc0"}],[{"shape":[1,3,10240],"sha256":"f1af68134d04f94151bdc47eec7d9e1c6153bbd4842ecaccb4432663d038594c"},{"shape":[1,48,128,128],"sha256":"35b44a56e33edd1b54d164d088ab9a0d5654cb9e11cfb9c5713343889220448a"}],[{"shape":[1,3,10240],"sha256":"eefa2a625fc8c4f53d7cc4ea4781eb65f903a89ba92af62801723759fe6b8d80"},{"shape":[1,48,128,128],"sha256":"0f6a1ce1f2fa76b94d6819bcfea54a0a8155caf437822d6f3302d8af07e0d835"}],[{"shape":[1,3,10240],"sha256":"7552ef7510586985a68cca98968b92d4dbf2a9f3a898430a18519407b61fcef2"},{"shape":[1,48,128,128],"sha256":"80da84d9e92c64a919dec401aa554e812956b270140e6bf4b68544a92969b15a"}],[{"shape":[1,2,4096,256],"sha256":"68d2be57fb3f2ede7cec4d11c662fbf08f56b39a32c0ba839e5328b961c8acd6"},{"shape":[1,2,4096,256],"sha256":"bb3bae696cb41cc6bc121f72705d4363ae3594a5ea8296f013dabb2c55a1713a"},{"shape":[1,4096,128],"sha256":"ba093956592cb1db5cda889366e07e3d6af1ae2e5af7424110738dbc8f3688d8"},{"shape":[1,1024,128],"sha256":"4a2698473a6c83b472b0eb508cc6b7b5faac50d69758b98fbf7a867a71eeb23f"}],[{"shape":[1,3,10240],"sha256":"b6807b08b072226910720517096427d5c2a919642444a8c4aa864cf665aeac8a"},{"shape":[1,48,128,128],"sha256":"4b77c5c73b440c1daae28a8b1ef4af082e98abeb2b9ec4657653551b8591a280"}],[{"shape":[1,3,10240],"sha256":"884df113e8e5365569204b755f859deea2d564bc1b04758eab9e48eaa9b81db9"},{"shape":[1,48,128,128],"sha256":"f2fc4fea1ffa275bcdb4bc0032606ede1314d52b41712f9bcf1c20fad85f2847"}],[{"shape":[1,3,10240],"sha256":"70bda7fb67cb7bdec6a76e2fdba65e97cd76e29384476584d4d4ec749c15241f"},{"shape":[1,48,128,128],"sha256":"13a16c748c118f355572e8a26a9d625a23ce9a82df4f7c4e27952fdda8e5cc2d"}],[{"shape":[1,2,4096,256],"sha256":"8eadda2b586a97fa9dced3364f8f3ebd80fba377e1ea031bf2a1bd31d35640a4"},{"shape":[1,2,4096,256],"sha256":"d9a7883d7857c00e330cb70680d6f8df06a9f59c60044534ee585faf8ba007a8"},{"shape":[1,4096,128],"sha256":"f037ced30e7a9fa104318c05706a3b5561da195ab5e1b1816799bde2cdda673e"},{"shape":[1,1024,128],"sha256":"67f9c38880ca277caf78665b3676bfa82560b44fc91355eaad5c87380f365315"}],[{"shape":[1,3,10240],"sha256":"ed4f5b8df13420ee370e1059736d35bc3297a94cae640015167363296d6b643f"},{"shape":[1,48,128,128],"sha256":"0d8af62041652d1d7f10e3ea8e379cf51ab714efc7710ee17c793eb194a95d78"}],[{"shape":[1,3,10240],"sha256":"2f54de901068484b4d48905e5987f8ff2d645f08e2ccde270538b0f9bee5cc37"},{"shape":[1,48,128,128],"sha256":"ca3b35918d53b63ec24e282ba51a2b604fffc551c908b4bd713ff322a67f4531"}],[{"shape":[1,3,10240],"sha256":"5e14d463b428230dcc4af8a158765201f279a7ae36de743801a7b4d01537a70d"},{"shape":[1,48,128,128],"sha256":"baccf6656331b6d45d0c3ed5a9408cd1b1d52ee1f13dd51d3586d13085f4e0ab"}],[{"shape":[1,2,4096,256],"sha256":"df797859bb03a81abf06366ac80bdf3fc8e67a6406eef95baa38b25ff9c41233"},{"shape":[1,2,4096,256],"sha256":"dd26b9ebe71db699a43e75ddfa743fa0f678ca6557990e9fd23317ba02566de2"},{"shape":[1,4096,128],"sha256":"a46ff65ec68096c059ed26d46e5033d6a8ea9d7c6ab9f19889ac8f35d179e134"},{"shape":[1,1024,128],"sha256":"8a79a6508d2d015bb8fd2205c99fbcd21e9956e992894d14bd9ca40914e3531c"}],[{"shape":[1,3,10240],"sha256":"2737581db5b7e2772a6e710263266159ecd787da826dbe0fe3fb8c3666f17346"},{"shape":[1,48,128,128],"sha256":"62d9da98e3c4bc0e2a5f03d8d753420a5cfa24ab23486022856422b169f60ab8"}],[{"shape":[1,3,10240],"sha256":"f0e4c2a1245d9b67dba5de7172d912118e0ce22d553abdaf4ed1d8c524a3e35e"},{"shape":[1,48,128,128],"sha256":"9a6215d264e47905adec112b838fa9e08a324c629b7e1333d9e197a23a7ec755"}],[{"shape":[1,3,10240],"sha256":"6c7901f9c932c99885e1f772d6da881e36224c4cf0f8f580107752d32f3591eb"},{"shape":[1,48,128,128],"sha256":"84ba45ce80cbe74b66d1c6d600414a2e6a77f7920436c60c7e649f394adc19ed"}],[{"shape":[1,2,4096,256],"sha256":"7b1e45b1e50d9b67d9ca332ff04892925c125216ffe9c334c4bb9d88ceafe51a"},{"shape":[1,2,4096,256],"sha256":"a1df5b87396186258e533c1d7a2d17a2820ef973aa76a9cc7a31fc8ca0402086"},{"shape":[1,4096,128],"sha256":"9d807277460e6cf8cd8bffe310f21083513ba1f9d100853b33bb9e4762615392"},{"shape":[1,1024,128],"sha256":"ebdc94148c0fbac3af11d9cb188721b5c3b901c2d64c62fded08add6497cdf23"}]]},"hidden":{"shape":[1,1,10240],"sha256":"2e69116f69bde88c681dc5952e7e562628b3e3ca02f1b75f343a095cae899179"}} \ No newline at end of file diff --git a/docs/issue112-row-map/hidden-2048-warm.json b/docs/issue112-row-map/hidden-2048-warm.json new file mode 100644 index 0000000..de99ae8 --- /dev/null +++ b/docs/issue112-row-map/hidden-2048-warm.json @@ -0,0 +1 @@ +{"case":"hidden_prefill","chunk":2048,"phase":"warm","cached":4096,"state":{"ids":[9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374],"logits":{"shape":[1,248320],"sha256":"56df72298db7d62ac04b1ca8a47f601654b915af39d4016621d369d328dfd6a0"},"states":[[{"shape":[1,3,10240],"sha256":"bcdc880d5ff875f668600fbfeb7aea34e5fa63299e59b36a7f9e25f2acb8002c"},{"shape":[1,48,128,128],"sha256":"2716d5f75b9d61d46fa343785a5058de1266cda5a6f450a92df082657a784c79"}],[{"shape":[1,3,10240],"sha256":"4279bc9d90aabaf65de0570abf879dc7c76664dbc4a6caaaeaf3253277b75d85"},{"shape":[1,48,128,128],"sha256":"6eb71ad246498b7d48c25ec2b2a62302cfc3aa54ef3b6791aa0e3a2036899415"},{"shape":[1,9,10240],"sha256":"c4e04a03ac4abebf1b13024004f9619685a79b074d7159f62cbfc87bfe139da6"},{"shape":[1,2],"sha256":"0028ec1720a202862e82bbb4e1381abbf2e465e95fd5b4051aba0847f1540436"}],[{"shape":[1,3,10240],"sha256":"6eb75218766641ad026e4bdcb16db3c53b1636194b015311c7a6023f6d4e285c"},{"shape":[1,48,128,128],"sha256":"a4470f31f32e2d13e873ec06d9f053a8fb81af9e0bd6e1dcac6f302386d8c8a9"}],[{"shape":[1,2,6144,256],"sha256":"1fe1dc004d69167908e62c1ff98a8cdf4197f9e3e0842ef6d94adebde3c317fc"},{"shape":[1,2,6144,256],"sha256":"e150494949cee30717611c6eb88c6ce4f70ed3d2d3af070e7a2cb3edf95ebb4f"},{"shape":[1,6144,128],"sha256":"0000a8f2df7421d1bb0af3990a34608bd33511fb8e88bd7e7eb60112e2405edd"},{"shape":[1,1536,128],"sha256":"782e2e750a61da68d4c575e153c68fd72782c6df610a33f6a19b6e205fedeaff"}],[{"shape":[1,3,10240],"sha256":"6481d1f61aa7832a9f2595bc16b6ff1c3ffd4870e95d5cc3d317e00cdd3b2c88"},{"shape":[1,48,128,128],"sha256":"f54983577e52f3604d10f7cf1529b83c030bda70fad9bc7d0e622cdf65b65125"}],[{"shape":[1,3,10240],"sha256":"faa82ec059396bf2228dcd96ee64d782fb96763148fd01ab8d44038540450f6c"},{"shape":[1,48,128,128],"sha256":"aca07fd132c7ddccf225798c2cbd461b949c79a26bf1364d72b708f0f248b105"}],[{"shape":[1,3,10240],"sha256":"a83706b6a1694259dcf737dee17a0ea0631ea93f179aea3bf38cd846a021e27e"},{"shape":[1,48,128,128],"sha256":"36b781d84b9101aa984ad60d16518c69f52302ea364dacf9475f78d8f97a65f1"}],[{"shape":[1,2,6144,256],"sha256":"0fadb4a5bc636bd80d05464b9d98baa7b0049fdb7d5d340dce635c0368a43b97"},{"shape":[1,2,6144,256],"sha256":"5619e8a39ffb37aeb4f736972fbbf134c92857f943ce337bf2b7cee857838c26"},{"shape":[1,6144,128],"sha256":"0a05aad811024c0a3ecf19cd7e8cb7e6ef7ae5c0136d9b4105d2df30600aaacf"},{"shape":[1,1536,128],"sha256":"c293e666a4a24bf806e7a5ff9022ac4c7180f7cd102280c7401d7a594b0c5b50"}],[{"shape":[1,3,10240],"sha256":"2bc608c3acdc0086960232919097c7f17104c9dad54dbf641183cb8ed8e2ac53"},{"shape":[1,48,128,128],"sha256":"ada1578fd0fe5356fe1d517cad96332b84c9f6b98b4993e22df719698ae3c36d"}],[{"shape":[1,3,10240],"sha256":"269316e76ae2fc95c6e6af3b4c395ab1003a3f69822ccf2306e670433a707252"},{"shape":[1,48,128,128],"sha256":"e5d41cbe98ad935651a3ea4ae1ab605ed579710cde8170618f6d8113c4034b23"}],[{"shape":[1,3,10240],"sha256":"5e5676983606e65238947794ea90794c237e7f72c499669504dff63c762385cf"},{"shape":[1,48,128,128],"sha256":"d33a32d33336d400a4ebfb59d40512defcb43fedad26453a9855e2bc5744711d"}],[{"shape":[1,2,6144,256],"sha256":"a4bd2e3484426d2caa150ebc642036b037684cf8b116960b653a3d77065c81b6"},{"shape":[1,2,6144,256],"sha256":"55859a80e778bc4c3a4b88ff7b8a338bac532af669c9b51bbf1cb08b7646104b"},{"shape":[1,6144,128],"sha256":"ebbe5e61dcffe9f43fc4ff1ca80c6409ab52d78ce569f887a6c75b82b709f430"},{"shape":[1,1536,128],"sha256":"dfb4f79411a71d464b8f31e7d716f75b66ba647d3f293f3f4f2b404be90d4ef7"}],[{"shape":[1,3,10240],"sha256":"0774eec782927d2cded60eb3fcff498df52b805b882bfef902f9ec5c50ae8113"},{"shape":[1,48,128,128],"sha256":"58f9f8d6ae40da9955f34931d645fa264b05d9c6108e0f217986f6c56663ba5c"}],[{"shape":[1,3,10240],"sha256":"8e2a28c8aeecd392ff980fd6e3013ce3647eebf9b4743da025849d028168f727"},{"shape":[1,48,128,128],"sha256":"6f44693aa3e8f7347e283933c73488a40b821155b83d23f78a51396aaf700d60"}],[{"shape":[1,3,10240],"sha256":"7546fb9094cd754b11f43af7c24d9e9b45b9babe9f02f4e865412988a6d1fc9c"},{"shape":[1,48,128,128],"sha256":"75cf8b7d0b838fc36f1f53098ae92b17ea5c32a8a6a77ec99e8e066a6bb97387"}],[{"shape":[1,2,6144,256],"sha256":"b4104187d36cb6b70d2093e35ac5fa9377cb28f333f52b4fb7b48d688872e47a"},{"shape":[1,2,6144,256],"sha256":"afe57ade6404e4d47687421666241bc659264ec7ccdcbb23ea2e278c06ccdf76"},{"shape":[1,6144,128],"sha256":"d36753230a74a10d24ad6b10da8b8e228d872f30ed5edee035dcecc7bd9b8879"},{"shape":[1,1536,128],"sha256":"2fa2be65cce0622fa4cdc9b71740471b34c764e75a9e7906d8af9aea07680835"}],[{"shape":[1,3,10240],"sha256":"80a6bf041c5892edfd518e4729f2bd74aa80d2b0b23a60c45ac56e471126cae1"},{"shape":[1,48,128,128],"sha256":"4bb9e43a75088097bbc2914c0f8ba2325cc047607e02fa100fd272a6d406ce7d"}],[{"shape":[1,3,10240],"sha256":"7556fc8db89bc6a6bd2012b6ccd27fdfb3de65ea4274cefc17bc74fc862feef5"},{"shape":[1,48,128,128],"sha256":"1602beda3cfd65de9f193718b2025e7eedcfda7847c7e9da1c19e0d7d6b9074c"}],[{"shape":[1,3,10240],"sha256":"f9c8ff77243a7ceae07df1886fb0e2e9f22aaf9c48b8758537f9c0206d091607"},{"shape":[1,48,128,128],"sha256":"8388f32999fb311cbf2604c03169f1ef6906df36ba09e2330d549765999440ed"}],[{"shape":[1,2,6144,256],"sha256":"0cf2c7561c2f5ca5e93e8c3dc779c5f6dc969d22bcb87552cd69a1129843f5a7"},{"shape":[1,2,6144,256],"sha256":"b034cc2fba85c12b1365b9eec70899285c70f717dbc101e89b8eb67ba5e36901"},{"shape":[1,6144,128],"sha256":"0058e0f6df2854c84635024cf0beafb30472176bce937866c25aea8bf0989701"},{"shape":[1,1536,128],"sha256":"feb981280879a693cb2556b9655ef6077b8e3c93b7070ae372c20ad6a9c99731"}],[{"shape":[1,3,10240],"sha256":"ba7f4094fcaec6e4fe39b78c53b3a29f2212d0276b9444802fe2a64bf55475c0"},{"shape":[1,48,128,128],"sha256":"271f93704b9cbc780b42574ab8f9a51f50ac84b9dad386bb1aecf58c712534d6"}],[{"shape":[1,3,10240],"sha256":"87db0be626e3357df11341b860615aec7d905b8c99c41aac8908d2d023d25c58"},{"shape":[1,48,128,128],"sha256":"d1c5482a2510106feec7ca34e78164eb1d92330c04ace81560659c1ce38c5371"}],[{"shape":[1,3,10240],"sha256":"4c32ac83c91f970a741e607dd19fb475b7963aa5e51f1d9e506ddaf1337ad45c"},{"shape":[1,48,128,128],"sha256":"249b32ff900a8284067d0121717e7eeb142163e51c0075d36d1544ef5b4c95c7"}],[{"shape":[1,2,6144,256],"sha256":"1221fc624d338876074f04e0604047644e831cca25f2d4cd7a9db2f975a0d872"},{"shape":[1,2,6144,256],"sha256":"d8fdefd191c6a3e247c56bc6584faa3f12aaedcfa247c489dabe7c6553add96a"},{"shape":[1,6144,128],"sha256":"1ce8de08bd9d9b35b55fdddac6b8ed6180cacb840abbd2e076996064bfa5af14"},{"shape":[1,1536,128],"sha256":"f110b41539dc94899d7b9a6750491ef6c2332974e015434e0b6f85338abd3694"}],[{"shape":[1,3,10240],"sha256":"97716e42f1f648167c976cba48887d2c26d5c67b6033e043c2b7a10b09ae7e4d"},{"shape":[1,48,128,128],"sha256":"36e8fceac983cb8a0560ee5b6d0e98dcab6cafcbaea2ab5cd323df7fb3e06e0f"}],[{"shape":[1,3,10240],"sha256":"0168fe63fe4e282124b6f63dd1afc30653c5f5cbda344cb4be884df40e560f58"},{"shape":[1,48,128,128],"sha256":"1fe31ea74d76920138a185ba9b2a666917cf8264a232cb3f0f8b5445d89c6cca"}],[{"shape":[1,3,10240],"sha256":"5ff627a3c41ada9a268946f49b79090c75998f7321985560a809efb392cf1e88"},{"shape":[1,48,128,128],"sha256":"665edbfbc9393d1e5c3ce4824df2631212ce4ae6e5dbbff1b98f445f0fe17f1d"}],[{"shape":[1,2,6144,256],"sha256":"32e707b730996fb21b712366c39366ef8a3c6ddec941a63c14c4f7835effadeb"},{"shape":[1,2,6144,256],"sha256":"10b24c21cb37e7f943475d59270f2ef100ccd3a5524d88c5806829d11f49ca06"},{"shape":[1,6144,128],"sha256":"00b31bb8786870da8e29735949c9f4561228263c5c27f0115cb72a7561d31703"},{"shape":[1,1536,128],"sha256":"48f863b9b42ff567d68147ccfbaaa250e2fb7539728ef08ed34923f5bb537e11"}],[{"shape":[1,3,10240],"sha256":"a692f8c8c73a01908c03d3c65760c549eba86e2c29d83b689eeeac9e620e813a"},{"shape":[1,48,128,128],"sha256":"c51f3e3fffc2bffb330c4a9036ddddbb1e3acc394eeff1eb3c9bb5f57fa9b0a0"}],[{"shape":[1,3,10240],"sha256":"8b7509b32b3e7a22622994f5702e3fc722e669e13f6cf7f9dbc1e7c1fe1af646"},{"shape":[1,48,128,128],"sha256":"3f7f04a72f4b76d41acb9bf3d7d6efb723b4d5559e3fb297960de0160541a895"}],[{"shape":[1,3,10240],"sha256":"d273acb08042c1abcc0aca9a218cb4908cd817d71965902123073ebf785be721"},{"shape":[1,48,128,128],"sha256":"afa5dcdb6955593851585c3e2e5cf6176cf5f63474dda45c33944651dfe9a6eb"}],[{"shape":[1,2,6144,256],"sha256":"335bbcb31e592b9fd196a02d476a7f499a388b036a7cd14508148b61bc6fc2ee"},{"shape":[1,2,6144,256],"sha256":"218cc455784eb4edb4a8d5255330c5abf535ac123c0f4b6cdff87e381529fa99"},{"shape":[1,6144,128],"sha256":"661a73be33d414459a81d59057fba86fe9a724a8143dc54f59949f707915573d"},{"shape":[1,1536,128],"sha256":"335ea33577245fd59f818908a6676810ea51f21b6c49969c7845b437dd600595"}],[{"shape":[1,3,10240],"sha256":"31b3a9a5ae98d709a8855684a84461d24d90db74e6be5df738161bf8ecf2e0cb"},{"shape":[1,48,128,128],"sha256":"4be7b163b1fd1ea0588086829127208411bea8a8ece5da323df3303c907f28d2"}],[{"shape":[1,3,10240],"sha256":"37d6325632cdf8a43ed3c719e103757c11f1a37ba77da27bc183ef387ce3c80d"},{"shape":[1,48,128,128],"sha256":"e58bc0cf1d842ade5a31077a7df1d5b493e63c9649179703eec5851baa011d37"}],[{"shape":[1,3,10240],"sha256":"1ea4a6dc3350fdb2b53b47c896c59dd43da369b2b7fa4862970c940fab924c9d"},{"shape":[1,48,128,128],"sha256":"fa9afc5c865c2cf5bdcf3dbe36591185c50de9079db7dca83ea9443ad701ce19"}],[{"shape":[1,2,6144,256],"sha256":"11aac7be8a0909b4394bc729f407e905d320cad1091a93f9e7e93d958e920c33"},{"shape":[1,2,6144,256],"sha256":"f549092febf504023ee9ac8a4302d940772b51303eadf9c09908917aabea9af0"},{"shape":[1,6144,128],"sha256":"c4fd087b5b177f4d61fee0afb8ab0e4c367554b72a9643624140e4b4c04c34dc"},{"shape":[1,1536,128],"sha256":"4a08712db7f8f78237993e815fdc491634e2329bf1c6173b5e8e01db6ca3d9ee"}],[{"shape":[1,3,10240],"sha256":"64de43e059558dd83dc88098bf8627aa3ee0c21cd8cb36ccd5b02174045c8383"},{"shape":[1,48,128,128],"sha256":"c1ded9b207ff212842613486665a9f05027794c007ec8df60b1267e8e439bd91"}],[{"shape":[1,3,10240],"sha256":"3ce6fb0279bc1b55bbdeea9369500f9d10c3f6473e317f38434d8080a3396fba"},{"shape":[1,48,128,128],"sha256":"a4f63f8c364ae2995035489a48f4b001c26b9a13e78fb21660c620e1a7e2aaf9"}],[{"shape":[1,3,10240],"sha256":"0dd63f796b5d748d80ac128c18dad9606ba24c7f74374cb8533feeb55d5bd9c8"},{"shape":[1,48,128,128],"sha256":"bddb58b62b57d4bcc218ea4dc5f1b5543d25a151cc42ab005932c6eaf31c812f"}],[{"shape":[1,2,6144,256],"sha256":"fd568c974084dacae3e1049bb5ed5c75a654ac048e05577f60771bf77091ad89"},{"shape":[1,2,6144,256],"sha256":"07a28650b67b63de527a06df1c03136d0e2f10573f437815cd161435f3ff1ff0"},{"shape":[1,6144,128],"sha256":"4e4d2e1a294201ea112f6bdee34aa21d649404b5dcc0d87c2fde290eb2e9c1bf"},{"shape":[1,1536,128],"sha256":"61cdb18eed6a1c96a1726d26f25925158b1db91796a8a783f10394b7fd0a1b94"}],[{"shape":[1,3,10240],"sha256":"cee93af7792b847d6a4cdfb02e9f72908339c416ca6a5dd8c106695add09e383"},{"shape":[1,48,128,128],"sha256":"0b15ee6dccadf86101f6dd0e2a52081869334450f5e8b89e3d029e5f1d8218e9"}],[{"shape":[1,3,10240],"sha256":"4d9c9bb58830e179f30f29123d5901428cdc26b87a1bec9940b65e392680eee5"},{"shape":[1,48,128,128],"sha256":"8fbffb8e81c1f7f7f2416e29306dbba5635a6f42092255a99bbd428e55bba531"}],[{"shape":[1,3,10240],"sha256":"04983f7521e2eb547fc8bd86a86b79944ccd816c7fd381004be8e3f2b534cb8e"},{"shape":[1,48,128,128],"sha256":"3de078a023fa57b047efb478f0c60fd6e9b19a84b269351824d53d7f2229d0e2"}],[{"shape":[1,2,6144,256],"sha256":"54b29f0e2e528364c1cbd34411b93ee51a13f01057a5b7c4e7748721b48afb0d"},{"shape":[1,2,6144,256],"sha256":"72dbfc9bed5a849f614f076b5eb2b08c7074da01339358bb65031012b3ecc9fb"},{"shape":[1,6144,128],"sha256":"aaa9e121972b825517ceea54a5d6ab51994c3152abb1fb9f542fb22eaad5db8e"},{"shape":[1,1536,128],"sha256":"ac985045f0b53838c82cb1a9833a86b1c8546e25e6db93e8735011fa53206a7f"}],[{"shape":[1,3,10240],"sha256":"13bb28ac109bde99713431c8f3579dc1dbf2e41518fd85e12eff50cb9f64ad03"},{"shape":[1,48,128,128],"sha256":"07cc812723060d0d01d380dc4875c233dcf9b471e62e3e87d633a967482dea85"}],[{"shape":[1,3,10240],"sha256":"bf266735e2024602ced06b7b836e4d760f9cde7924b15ed95332034dc9b0b43a"},{"shape":[1,48,128,128],"sha256":"7005f2be50be3c8e70990ffe9b9b07b1d8a44339b132b9e6bce3a2689f0bdd4f"}],[{"shape":[1,3,10240],"sha256":"ab787839a2115ce6f7d1314a9c28bf9ad3281090074efb8cf54ed4107a532ed7"},{"shape":[1,48,128,128],"sha256":"efc8598b3fa54489aa15e51c0ad44e737f3f3178139cc0445b4e4ad164b96e6f"}],[{"shape":[1,2,6144,256],"sha256":"e626ecc6bfd14a068800db9eadb52f9ff0a3d1a8b7d08f51da8eb9fe2b06621d"},{"shape":[1,2,6144,256],"sha256":"ec33540dcceedd843939912089c96dc2a749bb8283977defe06aefb669b649fe"},{"shape":[1,6144,128],"sha256":"99b2b2dc5133d2319d150140a435b7821f65c4d4b03e976f5929068947a8d665"},{"shape":[1,1536,128],"sha256":"fe027df882992b200f705e3818a2b3a5e79528b8e5ddee217a4cbb14c0a52ed1"}]]},"hidden":{"shape":[1,1,10240],"sha256":"e076f962b96fa16630ff0541e6a27d339b86e4096e4ecb87673ec9d39acf28d3"}} \ No newline at end of file diff --git a/docs/issue112-row-map/hidden-4096-cold.json b/docs/issue112-row-map/hidden-4096-cold.json new file mode 100644 index 0000000..eab648d --- /dev/null +++ b/docs/issue112-row-map/hidden-4096-cold.json @@ -0,0 +1 @@ +{"case":"hidden_prefill","chunk":4096,"phase":"cold","cached":0,"state":{"ids":[9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707],"logits":{"shape":[1,248320],"sha256":"20f19ffc007017a6219b32bc081d8ea0aa206f3f815bea52aaa687cf13e63c49"},"states":[[{"shape":[1,3,10240],"sha256":"ed247736e31812fa26da744900ff2912b3c85c06c4a2f25eaa2523425b0f2fc3"},{"shape":[1,48,128,128],"sha256":"227f2887f110c3d815617884f7c1e8bfd633232655883001e2ededbd122708b5"}],[{"shape":[1,3,10240],"sha256":"310b7cb97dc873257e458f92f4cb107377579fd7738f3adbe014b0c1e7337d12"},{"shape":[1,48,128,128],"sha256":"6bc05453a75324443ec74c5d72b8cf8f932ebd604f940bc50247f3fc11fb9fff"},{"shape":[1,9,10240],"sha256":"3b8fdc6640a6a35e9ba058f1515b57d868c7542b590e915ab07fb597e5107441"},{"shape":[1,2],"sha256":"8d0969fc231ab5877e0d06c555f460351e3affb6e1ca632a833406bf6f7bc15c"}],[{"shape":[1,3,10240],"sha256":"3be5a0c27b7ce3649507e4bdabf7e6630328e1fb9c145befaae81e6ae4097b5f"},{"shape":[1,48,128,128],"sha256":"aa203a9f8f2563e18119306eeadc4faab94dc2960b16c8645d1543d59d1f5524"}],[{"shape":[1,2,4096,256],"sha256":"328d2f83a1fbab8233787186cd6bc686e6ef5f21158ab8ea9740dd58614ca3e0"},{"shape":[1,2,4096,256],"sha256":"41de3fd8442b90009c1cb29641687bc074dcbeb8db11b5c45d429792da3778b1"},{"shape":[1,4096,128],"sha256":"a08b8609f47b20590ea77ff22d2e4ae150348a55a732bad77b556b84a2a0b69b"},{"shape":[1,1024,128],"sha256":"d3b55837a3505c0ea97d7330b377304cf6cb4b2b3a75a4d7c1d8c24b8d6dab91"}],[{"shape":[1,3,10240],"sha256":"812106dbf3a37efe9469b586a7112eb22d4d64fed5798d8f35b9f3a71a9055a4"},{"shape":[1,48,128,128],"sha256":"b5ac8baac3bace06497b985cb0db8e41451795f42b8ae394f0ad8402305e414b"}],[{"shape":[1,3,10240],"sha256":"cc315b01e403b2b95c1fdabcedf6226b1f60d4886d1f7a099c294ee2d26757e0"},{"shape":[1,48,128,128],"sha256":"3a86c38fa6123a8ef21f6671cf86ec5271990d5813702c006621d843b7c1d59d"}],[{"shape":[1,3,10240],"sha256":"a87707ed494d7a6c940319c6bd2f92fa9db96a8b1b3a79b871fd8b0dc16c22c9"},{"shape":[1,48,128,128],"sha256":"65c97726998e428fe7d0187c741de1ab1a24eb08003d63d46ccf89d7c740eb8a"}],[{"shape":[1,2,4096,256],"sha256":"d764a58dfb0023944353e2a89e4e259131a75316ca9afe8a7b86990271b19112"},{"shape":[1,2,4096,256],"sha256":"6ee93c70926935d0a630d8b523bcc9c9aeebd54931ce65c7bc06173aa3ebd9be"},{"shape":[1,4096,128],"sha256":"7100bb6730da6eb7c213c8bf865ed72830f4fff23dd453bc4636e0a12a3d915f"},{"shape":[1,1024,128],"sha256":"c4237f24bc2949d1e26f2ee99ffbc63b72dc697c1f08eafd850c6140a9e358b6"}],[{"shape":[1,3,10240],"sha256":"6d66c5d9eb7f8cda8fb0e76f316474c182bf48b217cbc74f8cd1b8bd9c2e5429"},{"shape":[1,48,128,128],"sha256":"faec2ee85cfa3d09ca314dcacd86655ca43fc2be25d64f9f6ac2337719db717d"}],[{"shape":[1,3,10240],"sha256":"85ad5ec9039ae0f04c82abe1a39863be56dacdfee1bfd1ca276c1fa5355f10a6"},{"shape":[1,48,128,128],"sha256":"3ad0e91ee4e02e16cb60a67d2b6e5627d308a22251769d7c538d1af4b40c6b7a"}],[{"shape":[1,3,10240],"sha256":"0b585cdcde2326086f007c8338e6afb8f28ebb609995349ddcffdd7cf51c4d0f"},{"shape":[1,48,128,128],"sha256":"30d563fa7b741a41e3ac7029f227341f2a699e3661b27a841403d5dc4b0604fa"}],[{"shape":[1,2,4096,256],"sha256":"8634ed705c77741ce8bded169a27685d4affbc7f436d285a29f30367d5376aee"},{"shape":[1,2,4096,256],"sha256":"af8061dde96361e0dd396deb1f06f610cfa0a59e0e11bbc9e69de90b6df48f3d"},{"shape":[1,4096,128],"sha256":"c8a02cba32cebe690fd917328617c7760831f1c3c428984616f77692a13e1291"},{"shape":[1,1024,128],"sha256":"0e9f8776a574c03001d3ee31cbd3f33fe7970994f4481ec015f67b9947286775"}],[{"shape":[1,3,10240],"sha256":"ea025732f610eab905ae8f82857109cda7f207f958353f91517c6f39df575755"},{"shape":[1,48,128,128],"sha256":"533693c0e0d5ad173683a307722b8b5cdcabe2591f049f927f2b4f400949234e"}],[{"shape":[1,3,10240],"sha256":"8d88347e4630cc1e847ab073ac17c2f5ea78fa4e89c0f937e4556b88775407c3"},{"shape":[1,48,128,128],"sha256":"3513ccde00c09c73065c842a22963d2ae60870f1eeda7548162cf0cac8247597"}],[{"shape":[1,3,10240],"sha256":"577acaef0f7adefbb911c0ce3157d37635251a4e91cfbc11fc8acd27f82445a8"},{"shape":[1,48,128,128],"sha256":"5db4b90a581040cc47cb74ed4bc4fb7920834ed7373b478ba3c371fc0484add5"}],[{"shape":[1,2,4096,256],"sha256":"d3469747ac51dcd735e09ccad15c83c6f2b19945ca9982e4f6c2c3ffbf1b5383"},{"shape":[1,2,4096,256],"sha256":"0103414421320c2889c322986cc3881d5ecd32c8bda53ff9900a41b10eee1302"},{"shape":[1,4096,128],"sha256":"034883454a5647d17ae9c8089e1ef29412ae040efcaae90c7a5ad87e5bd85e34"},{"shape":[1,1024,128],"sha256":"6f4cabbec07fb712c5b6a34d08c4caca58a72d9b655a2af8f6b40fb513740c22"}],[{"shape":[1,3,10240],"sha256":"cc9e920a3884523284dc1d9ea6cb1b9a53dd1c298d56726f0b6e5458c6852f23"},{"shape":[1,48,128,128],"sha256":"0cba7d986a97f5876e9babc0af0b4985d6da277445f39e26d40ab72215d8b243"}],[{"shape":[1,3,10240],"sha256":"6ad77f59b6d81be6148c90e6d4d02cdd59ee2b28289a47665d0c427bc9123b9d"},{"shape":[1,48,128,128],"sha256":"4b1d4c8099366615f5d296f91fe8875b62046300b845d60d92d01d5a59d9a649"}],[{"shape":[1,3,10240],"sha256":"019bd97a50472c9c17c0a2226a705b7cf83d79b7574d2d41bf7c46b0aae2fac4"},{"shape":[1,48,128,128],"sha256":"847a35305eccbe289fee00c4de4e9b8542b3075e46baac9653bba0bd99ad75d4"}],[{"shape":[1,2,4096,256],"sha256":"3794252012026f90da96c54339b6c28278701410fa4dd86c91a893676aa7ebcd"},{"shape":[1,2,4096,256],"sha256":"0503e7df06ce1df306cc912ddc803ef44a214cadf4116b08a204ea469f60b816"},{"shape":[1,4096,128],"sha256":"3bb611bb0aea7144a05c62c1b7a89b78d184fa5cd8c0de3d4e134af33cec47c7"},{"shape":[1,1024,128],"sha256":"7e9608e3a9e38a881bed9959c73b6c81fa7a8a2d3ef564676d12b82b8929d2e6"}],[{"shape":[1,3,10240],"sha256":"80270f86bc73f6c187e59047a6d1c0f8e6b828fd3914343f2491404fb42b8715"},{"shape":[1,48,128,128],"sha256":"3fbfb6d61c353501464e3e651486190ed4d766ec6547ef42c412f71ebe37cd88"}],[{"shape":[1,3,10240],"sha256":"a864c171c3a711cf35ec293fb38241b8132110ea2b9cbf7b5b3231c741487b27"},{"shape":[1,48,128,128],"sha256":"06a647484eb14498ee5cb21507719477086200477457824fb849adbf91754d03"}],[{"shape":[1,3,10240],"sha256":"94e30a0f60eec809eff4abc140ea693f4b3f720f08a2eb57420abed140382768"},{"shape":[1,48,128,128],"sha256":"72a42ccc679e65d2538ab6f1fdb55142fb9113da9090bf44f9edaf7a477142ab"}],[{"shape":[1,2,4096,256],"sha256":"d723118ca3b2fa3d5e12f62d42d7e557e1e73222db7aed739d3997a101b84c12"},{"shape":[1,2,4096,256],"sha256":"4a5493abbee79cb50958e88f81638a0806ae6bbdc6c48f0b057f5616e9083fd5"},{"shape":[1,4096,128],"sha256":"581449a5a233e414d9c2c31f4dea79627933f4cb1a6e1d36a3eef0155ff4124f"},{"shape":[1,1024,128],"sha256":"1148587bfa30ecc950ce576d45cdbf75dd74bed96113c837e521f295f11ce629"}],[{"shape":[1,3,10240],"sha256":"3211ea1be6bd0dcd39e3de452203c6181ba1ff822b6902143ee96445b5322aac"},{"shape":[1,48,128,128],"sha256":"84b81a42fe872b4eae6d3b7db19112df2ac94234a77759d1a0e03ffb426bd8aa"}],[{"shape":[1,3,10240],"sha256":"dec512907360f31632c2c842ffaf9530c35a29c2cb134e7de69785f97437a499"},{"shape":[1,48,128,128],"sha256":"9a10638850aee9315ac8bbbf2a7af1a19bf231f2db5b934a59716b57acdd41d3"}],[{"shape":[1,3,10240],"sha256":"e971a197b173097f11d08637ff5c9f44fba456e8927da5ef3421609ea942f481"},{"shape":[1,48,128,128],"sha256":"ae1cf9ee05523f9f5f654ce8b576b444d0c1b7c367f7c043f558bf344385b66a"}],[{"shape":[1,2,4096,256],"sha256":"d8b8f3b95c92409cdccf367a8ace819b04fd03c27e26c13950720e6c17759637"},{"shape":[1,2,4096,256],"sha256":"dc9b81d1c34fedc82dead070c13f60bdd591d3f0afd0b52d2cc5bf00586f75e6"},{"shape":[1,4096,128],"sha256":"8514370f11502198a35e2ea0415954187d552d8a26620f5da2c82e3ee7cc1dfd"},{"shape":[1,1024,128],"sha256":"83b7679548b1b0c02f834d4ac7caee87ed34aa258f0a6cb74c44d663acf539ff"}],[{"shape":[1,3,10240],"sha256":"e571368a82ec0138be6d5cbb399cb95a65187263a1e33cc303d7c696b12824d1"},{"shape":[1,48,128,128],"sha256":"e309e30c515b044439286cbb5f4a8c5d16ed8b1906d2ced0eead7580c2579c6b"}],[{"shape":[1,3,10240],"sha256":"f442a6f0ed2982e6b5c19276253616a7ef85022cfbf4fb88c1564bffe4b5a562"},{"shape":[1,48,128,128],"sha256":"f3bdece248e17971960ffeaf747e7e31975a775618352f9de39ce8487bb0e1e1"}],[{"shape":[1,3,10240],"sha256":"a6b32c0cf592f845e744afcd0cc9a3302446f63bac72f1cc28b4fb2c24a3f444"},{"shape":[1,48,128,128],"sha256":"d378aed84040303bd924eeec7194cc51dc73e8d2e65c73f1bbb992c58b5cf789"}],[{"shape":[1,2,4096,256],"sha256":"a95046b0c092210f0f0095a6eff43a37b85802346ddbf116fb7063029c60555a"},{"shape":[1,2,4096,256],"sha256":"8f5d54514f2522bc89f791aefdde274d62bca0ac8f57a994c538413dccb2669f"},{"shape":[1,4096,128],"sha256":"e8ccd31bf2cda6e252494a8c92bed431e3fe10da915325b0f74c65d33bf3a31f"},{"shape":[1,1024,128],"sha256":"8aec51748ed1f27aaf73e181ce0b7599089c3593de47a8c2038b972b56cbde40"}],[{"shape":[1,3,10240],"sha256":"d55c8a62c11a21730ed45213ef46c1531cde4c52942a932e05367ef4efe5066e"},{"shape":[1,48,128,128],"sha256":"fb2746cb16350da8694f6ab7ba939801f6ef9e0a431c72fd1f4e2409226b0cbd"}],[{"shape":[1,3,10240],"sha256":"d7dcae9881c8db08582bd074791e1096ec030a7be572c148fc5d925c1f037da2"},{"shape":[1,48,128,128],"sha256":"6e958f7cfa6dab6f0df88ee2ee1eb4fbadfffa4dc6baab630e32e77770ad2fdb"}],[{"shape":[1,3,10240],"sha256":"de31a0ee82968a5f97177a7e680139acbf8380974d0a54c92a80358d3649ecde"},{"shape":[1,48,128,128],"sha256":"91e8a323ea6c9fbb5d1e3b2d5ddbde10f37367cbd5d248dd0262487e2a9c08a0"}],[{"shape":[1,2,4096,256],"sha256":"c03d73848731bf47bdaf674a5fecde635701d621030945858762733d947d6199"},{"shape":[1,2,4096,256],"sha256":"3f17cf05ac73f55c6f564127160638751769b79b783187084d52d318d82be146"},{"shape":[1,4096,128],"sha256":"b6430934c7768533f9c78090aaee6b5cfa14cba114e321106ef8880c1e9d6ec9"},{"shape":[1,1024,128],"sha256":"842d23ec91f817ab388514a28aa198aa9613f0bbc438d2ffad5d967d7e0dc153"}],[{"shape":[1,3,10240],"sha256":"374a58bc05f64053f46d55a152d2dd23d3187b0f52e67f415b3dfcac093e080d"},{"shape":[1,48,128,128],"sha256":"8b71f09222f30bf3f63d033f4d5bf330115cf71ce913e56be06ebfa78b3c4bbf"}],[{"shape":[1,3,10240],"sha256":"7824c001d29c5c962ad607c0de7208781a16537de01397de6a1966b5562cb138"},{"shape":[1,48,128,128],"sha256":"488c8a25998b177cfa2ca7fe99b6ee6ffb8e60d3142bc9991459bd75b3616ff7"}],[{"shape":[1,3,10240],"sha256":"7b9067ecd6606b767010a7345fb17f257e0e96f07b4841a94b7ebcba270920f6"},{"shape":[1,48,128,128],"sha256":"b8f6a020649ba61b134c1f3407e1bb799e576ff63aad316d806d8b764b4a520d"}],[{"shape":[1,2,4096,256],"sha256":"08a5956e8e0f97659594f8fd58f653ea659fb7f42b307c832aa5c9b2285ae60f"},{"shape":[1,2,4096,256],"sha256":"f898559c5b0c2c37204616e62158b76bcaef377cf64940f7c719dc1cdff56127"},{"shape":[1,4096,128],"sha256":"c0934ab07502734f95d87feedb91957ed662e15065a56a5dfa552009f433b98e"},{"shape":[1,1024,128],"sha256":"68f5d6c1d7e268d44e2ec7fdc6ddf32a08480470885bb555fe3dac6e06abedde"}],[{"shape":[1,3,10240],"sha256":"ecd7d4e621805070c697203e1da138cf48980b34aa3ea79cedb65ac9bc1854b8"},{"shape":[1,48,128,128],"sha256":"aebb3033d19eae0b561adab3aabfd2a5c8bb7f6af449f5cda1068e6d8bc6ac4a"}],[{"shape":[1,3,10240],"sha256":"8fafb00aba8998540ec152778c496ceadb5aedd96cde9049fc63b357f552de40"},{"shape":[1,48,128,128],"sha256":"9171862d295ac20682e012cdd87773100557bfb9520329a3c13ef4e6f29d28d2"}],[{"shape":[1,3,10240],"sha256":"1351698b9dd177d59099959b3c9675e033276728918cac7b7cac97a14f3ada68"},{"shape":[1,48,128,128],"sha256":"11650d5a2eaa6d9c3b87322b6ae3a39e851f1902d324a268566f64036a6e5e63"}],[{"shape":[1,2,4096,256],"sha256":"4beda94b1628c34eb91d500051871c633a44c330cb66bee7d65c753abed1ca24"},{"shape":[1,2,4096,256],"sha256":"fbd05dfa2c49b9e9062a800e9f28b2f31571454d9028801b45bf27e88572ae51"},{"shape":[1,4096,128],"sha256":"683439e8fb9928a573ce21c57cada11af6a61f6e74977a18a2e03becd44b5d11"},{"shape":[1,1024,128],"sha256":"5f6d6c1b283d5da27234f908842fa88361ae6b1d67d728cf95665f3eb616539d"}],[{"shape":[1,3,10240],"sha256":"2ea6889a2a40d65372a97a5b4fde45efed2a9ec2f9adbff42561bc07fe4f5f87"},{"shape":[1,48,128,128],"sha256":"97fa3333d2ed17004803a751c3af69702b8bc43ff77b6c64e6123e90cc4602f0"}],[{"shape":[1,3,10240],"sha256":"a66a306d695e9817ccee753f886629e31c20f3c0c83fb04ecd4b49afa0f8714a"},{"shape":[1,48,128,128],"sha256":"c21f9354fa4401f79974e52b7b01dd79d7a81a1cbfd89ef1964e291e29465470"}],[{"shape":[1,3,10240],"sha256":"07ed21635ace59c035bad7b22a4f7090cd8ef979bf614199646f94e724afb622"},{"shape":[1,48,128,128],"sha256":"72ebc9ce76c12b09751d302f6d7f1546fcd072ea708eaa267a22cf0a691c4ba5"}],[{"shape":[1,2,4096,256],"sha256":"6c70011cc4e5955750b784fd7ca89f45ebe7260a9a583af49b4652ab88d5258d"},{"shape":[1,2,4096,256],"sha256":"c82296d136aa4c9293ab5556d6cda2aad18dc983c32e5d39558d2cbec8f76cb0"},{"shape":[1,4096,128],"sha256":"608bfdff96eca665834e183acae804557dbd768018175b2f46dd944ac20acb8b"},{"shape":[1,1024,128],"sha256":"433699f4a0b21abae389eb373958bd2e3ae36cc1c80b68c0696e92a986028046"}]]},"hidden":{"shape":[1,1,10240],"sha256":"6d6e7f0aa02134fc5eb877cde918402904ca147e0caef392354f006f3ad6480f"}} \ No newline at end of file diff --git a/docs/issue112-row-map/hidden-4096-warm.json b/docs/issue112-row-map/hidden-4096-warm.json new file mode 100644 index 0000000..06350d3 --- /dev/null +++ b/docs/issue112-row-map/hidden-4096-warm.json @@ -0,0 +1 @@ +{"case":"hidden_prefill","chunk":4096,"phase":"warm","cached":4096,"state":{"ids":[9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374,264,1092,13,9707,11,1075,374],"logits":{"shape":[1,248320],"sha256":"8acc327d23c2ecc37f6814676dcc6f53d0cdf088b6be231553be5ee633ff003d"},"states":[[{"shape":[1,3,10240],"sha256":"bcdc880d5ff875f668600fbfeb7aea34e5fa63299e59b36a7f9e25f2acb8002c"},{"shape":[1,48,128,128],"sha256":"8df208ff1c303a4ba38af8f8785d2cf1a3c684cd4e4a7b51a0e5d96a88c3cbf3"}],[{"shape":[1,3,10240],"sha256":"27fbd8ab2890a1e7be41d1b1a76395bc591be4fb4c0ead504f43328d2b40f8d8"},{"shape":[1,48,128,128],"sha256":"df6f37f510803a54ef3b567d932cb2cec074372f61522ba597ce41f39b39cd1c"},{"shape":[1,9,10240],"sha256":"e41a5afff2906c8e066666c62435090ecbb00f04cafca6a91a9f7078d92fb52f"},{"shape":[1,2],"sha256":"0028ec1720a202862e82bbb4e1381abbf2e465e95fd5b4051aba0847f1540436"}],[{"shape":[1,3,10240],"sha256":"b109220b9a12897264139d08e08fff5e7d2ae021454a49fa9f10bb88b151a839"},{"shape":[1,48,128,128],"sha256":"8762effa06bdbc0c836c9c4a0e35b6f515168115e730c43138a4b214b9765589"}],[{"shape":[1,2,6144,256],"sha256":"b7d00e1b3c25c311aa5f9d417b11eed76cc022880e79b1e060d6a9278c798581"},{"shape":[1,2,6144,256],"sha256":"16d607a661c690dd3b2c46a691d3838973f56e462505615753e8b61101083ad2"},{"shape":[1,6144,128],"sha256":"7d7e06d3d3d4f5c822e63715eb3b136f062a02a6bd1439d5a8191f21654dc110"},{"shape":[1,1536,128],"sha256":"715200348e9ed081c5e88d4a762d0f91b6cbd43ebcec5674c7299f29a297e934"}],[{"shape":[1,3,10240],"sha256":"cb058d08fa3f227235e617e448affe39e374cf57251c73c7aecba9776db39258"},{"shape":[1,48,128,128],"sha256":"4995e49f7fe696160142a332a65dfc5cbeea20583e45ffeaac401e5fcb107c64"}],[{"shape":[1,3,10240],"sha256":"18ce2fc6dce242b79f0f9c2820c64fdb1022d6c431ad34dea6da926b56f2bfd7"},{"shape":[1,48,128,128],"sha256":"cfd64de22024fa12bd2207eecf2cb80e961a7130772ce8b4c6818d495850d03d"}],[{"shape":[1,3,10240],"sha256":"cf47a8e46a2eabd4126bbba352ecb49068412845c4e54a6cc49515272657f2a9"},{"shape":[1,48,128,128],"sha256":"cb5eb66b29a5dce33fad606d6083dbc57186abc903bd1352ab123dc339fbc638"}],[{"shape":[1,2,6144,256],"sha256":"8fced564bf1b55eae9ffaf3c6c0c23bfbbad725c7facdd0b6d588387d62b7584"},{"shape":[1,2,6144,256],"sha256":"f81cd95051d0e3fce5933b34635a6b94568d6aec6999f21407ccbf20e4ac6569"},{"shape":[1,6144,128],"sha256":"dc4296db595f53719fb2d01a8417094add2c6c432b674444d6b2c86194107764"},{"shape":[1,1536,128],"sha256":"7778f949eca2965e615a54174bd2961c37080a31427d605f6ac816088b648907"}],[{"shape":[1,3,10240],"sha256":"21fe14a27b30f95bd0d89ade4055c870ac680b64d5f6e5b391fa674179496802"},{"shape":[1,48,128,128],"sha256":"e7e66981d7775255242a379a010d5e9acc5c70fe556a6b8e46f36c2ce5a28921"}],[{"shape":[1,3,10240],"sha256":"104e04fe5addd304bbf3e9d2cac75397c479de55e112814665a7f24c048e34bc"},{"shape":[1,48,128,128],"sha256":"3fd66641b43497cf1ba1d357f742e6a7c4d59b2e742da32dcbb285adcba1b447"}],[{"shape":[1,3,10240],"sha256":"25c548b02a777a3e01e797cfc4ebe529b3c5b4977e759dae37bd419221867cba"},{"shape":[1,48,128,128],"sha256":"18e5d5bde1ddedba198725791f78676cda3240ad3160fe7fa57b18de1cd8eb96"}],[{"shape":[1,2,6144,256],"sha256":"5a0e05b14d01f64ab47a2bb37f5c2e9ccb0baa345bcf6e8886dced29551c3936"},{"shape":[1,2,6144,256],"sha256":"173d9eb6d8f930809e2ddb81d04802aa27582f969c8665e7fb2edf923f8a4a94"},{"shape":[1,6144,128],"sha256":"5e08760e66db1b97ea73ed64da2eaec6f8f8ec25625cf11366af48984b7f5740"},{"shape":[1,1536,128],"sha256":"ede98070152ef643ea1c56f149382328f81bd15763e67e81aacb37c66141c49c"}],[{"shape":[1,3,10240],"sha256":"afe196ab2d5bfc257a098367fb38056532201486c1fe0f91d506ad5e7c97b5ac"},{"shape":[1,48,128,128],"sha256":"d8fbfeacb30b60bb7d8cb5d95cc46ff150cbff3030a4b152314b5f42a5500bc2"}],[{"shape":[1,3,10240],"sha256":"94eb15c9bda7a6d3f1e28c268899cde12606d6a15d4d4422aadcb21ed905d1ed"},{"shape":[1,48,128,128],"sha256":"e77b79f3da44fcca9617849faf1a21f3ef90ef713db11805fcbb44ecceef088f"}],[{"shape":[1,3,10240],"sha256":"7cdc686ded5ca00e285f1a0dcf57b5e3d36898345932eaf29d15ec7db59bdea2"},{"shape":[1,48,128,128],"sha256":"34a232a378988670ea4e4c48bcf6fa9a9a3f32c93005217b29f4e8ded946ae48"}],[{"shape":[1,2,6144,256],"sha256":"e1ae32dfc6cdc68cd802f3be9905417f12b8caebbf481ddc368f67ba7a8a6335"},{"shape":[1,2,6144,256],"sha256":"8acbb021081866f406dd378c9efd1b8da6022e150476d9964b550bb60c669da8"},{"shape":[1,6144,128],"sha256":"39656a74da7baf85620fc4781d4be38e7452f27d53f969e657aed07cd7ca7b0d"},{"shape":[1,1536,128],"sha256":"5ad51566da17a7fc7d3f00f1dc17c44c0ca0e18e6bbd5440fe0b12b676546827"}],[{"shape":[1,3,10240],"sha256":"9d29430c22ebfad3733fa44fe88a73da75763885ea6d924ee627cb55899a47bb"},{"shape":[1,48,128,128],"sha256":"d4ae42707aaec90f9b67ec3e4d658aa81b5943c4ace65bdcd10dac539dc325ac"}],[{"shape":[1,3,10240],"sha256":"68fa778375868cb44cb2767421b2d452d53f51395dc958625c0b060834389b29"},{"shape":[1,48,128,128],"sha256":"44337adcd12afa76d80cf477e9b7bc2c02862872f23b0ff79cbc4cf487579b75"}],[{"shape":[1,3,10240],"sha256":"512c729fe255aab16594e3f9273b66cbb65c62f19dec7e6d207c514b90b9ed63"},{"shape":[1,48,128,128],"sha256":"8611c0c4ff243e84587df5c032cac14ec89ea04a7ae3ccb1bf69c170de60b3de"}],[{"shape":[1,2,6144,256],"sha256":"d40c49fb45f3139e60d3f2e2725eac77e82088acea46f8820a9e346750460832"},{"shape":[1,2,6144,256],"sha256":"f8090555bf1fefc3937f8e5a02d4a34b8a843b48907ff037ec7d3f0771352aef"},{"shape":[1,6144,128],"sha256":"e8fa6d6491643270376aa79669cbf349d89119b43f7c20e2c08c8c1d91272060"},{"shape":[1,1536,128],"sha256":"2078e6741f43c0a0fafeecf01db6ebad54c87f19af8f36378196451f8dc2bce6"}],[{"shape":[1,3,10240],"sha256":"331d525cd66a3b30d6d8a9231a3ebfa97d54a8e1384e0ef0a8f4d1c80e535117"},{"shape":[1,48,128,128],"sha256":"1fee049d21de9d0021e41a674c1a73ec458dacf0bffb7cf31edfcfe7d1ec069c"}],[{"shape":[1,3,10240],"sha256":"3322febe90787e2fa452c01a7c2190ebbe753721533a302e4f7dc3098b64e297"},{"shape":[1,48,128,128],"sha256":"3d54fb8bc363e6aa55d424358812616e212b85386128e417a73582016cb070ef"}],[{"shape":[1,3,10240],"sha256":"c12ec5032daf371c3410c0bf8238c76b0c3233197bd23b6c03bafa73bffbf6bd"},{"shape":[1,48,128,128],"sha256":"7b8fcbd53f0d9a9326c0cd3867f548579eb66ad48081b1f7464f5fa080a3b989"}],[{"shape":[1,2,6144,256],"sha256":"ed9d0a0b6f46764d7545ad2c0b4dac6ca04f3e60b106675ea556bc9f0c698bc4"},{"shape":[1,2,6144,256],"sha256":"7d378fcc71d44d1c859d4dc6b4664bb5f59ba8a61bef839753051ab51824dcd7"},{"shape":[1,6144,128],"sha256":"f02a6dfb0f95d4b1425e970d3d482a0944dc48d41405abcbc04941df40bdd8e4"},{"shape":[1,1536,128],"sha256":"ed2976555e880d8d3d9dac157838f49a3b66b1e7494ccd9602d670c91719686f"}],[{"shape":[1,3,10240],"sha256":"1195f30bed69736f50916f352e61b21cbfee13b035b1b6674a74984267a8820f"},{"shape":[1,48,128,128],"sha256":"32848957e735e9516b650dd5a1295d5b0f1f06a93e1b0e657d7b49962221d8ba"}],[{"shape":[1,3,10240],"sha256":"ff3aefea9ec4c68563b4eb19f5a83d1be7b139bbe81406c775d17248afdede6d"},{"shape":[1,48,128,128],"sha256":"b173e75b02711239dc681e457f643ce4d9f9544bac9e9f94159542363f6fc5c2"}],[{"shape":[1,3,10240],"sha256":"1b2f12fadeea126a1cdd860ac5335170fe04f11b32de3d2aaf150b491db2252d"},{"shape":[1,48,128,128],"sha256":"ad2705574571439389652856e129487635d97e4f6c3865523cd08b2208475c95"}],[{"shape":[1,2,6144,256],"sha256":"e6a15ba03da86c99048fce1dbcb99151f7278161891153589fa1c196b6b60928"},{"shape":[1,2,6144,256],"sha256":"9cb0c7635ad1e6f1e268db3ac290c366589956929addd07b0ca56859fc52ebb5"},{"shape":[1,6144,128],"sha256":"932cf6f110942dc72f9c293ead462fa1acb769c4f94de70079238dd9a243d71a"},{"shape":[1,1536,128],"sha256":"70fa6847d7f2f955a2c04b2d5d9a22a94b98fcaaf1ee9066dda8413a9e700f74"}],[{"shape":[1,3,10240],"sha256":"f1e68f7b69916353049cfc7c1822290437ad837713f39e48ff030f27b2a7ba03"},{"shape":[1,48,128,128],"sha256":"91a7d616aabee3ccc17a75c29d8e857875fa08d094c06e309bc79fd5e84d86c4"}],[{"shape":[1,3,10240],"sha256":"bf64764b2e933f73bdc8cf8999622b3229188fadd729876a16918ddafc51bb22"},{"shape":[1,48,128,128],"sha256":"fb17d1850e3fbd6d31d5bba0606f3229a71935c00217c19c770466287e578982"}],[{"shape":[1,3,10240],"sha256":"87d88b468af31b4476338ac1a01f54c7ec099a846c8612e7b0ca65a8a5a94ae1"},{"shape":[1,48,128,128],"sha256":"cd6b3c7fb6e6e82fc39ed5d9eb39d9fce6a22343c388ecaefdf06a7b64092c0f"}],[{"shape":[1,2,6144,256],"sha256":"ea94fb3bae4aba36d8d062de79239dad81648785a5fbd7e562cd270113c5fa7b"},{"shape":[1,2,6144,256],"sha256":"b89123df2a36b741026e5934ed4d0686cac1c0979b613250c94d4934c9982003"},{"shape":[1,6144,128],"sha256":"523d060d6cb6f3c101bd6b81343250d3d9d1705e2f3f276622446c099e05029c"},{"shape":[1,1536,128],"sha256":"df2f51fe263460356e4fad8494fa2c11424c6d34410e8ce3b1412fbe44a9870a"}],[{"shape":[1,3,10240],"sha256":"e625f5d2c955b1a330d76199eb8d9451e39e2f10884cc0e5533bfe546bdf5efe"},{"shape":[1,48,128,128],"sha256":"adc823d6111c7da1fe2766e46dccf646723e7548065a101af4c0597104532046"}],[{"shape":[1,3,10240],"sha256":"36dcc2ed58b8baf6539b591039475d50d0241c47b1d0bc5a88c30fa0f5730905"},{"shape":[1,48,128,128],"sha256":"3c3c2a7518f7ace49b47949f10fc72cd5b8e6c0c39fcec514cf5a381f3d2335c"}],[{"shape":[1,3,10240],"sha256":"5a8cfc67e2d883933b75e88c804774dd0b54e82141ec5d20fa02562dba825fb4"},{"shape":[1,48,128,128],"sha256":"6c45fc5876314e0095e3baf8396a321dd653db1cc04aac51d6efe6a67844f313"}],[{"shape":[1,2,6144,256],"sha256":"5b8fe2f62be00274a6c83e138738efc0194822a061ef9ed864b0ef5c0a38a389"},{"shape":[1,2,6144,256],"sha256":"de08e544aa5231f055ea43db711d3f4b635affa18acf439f870c0b0741160245"},{"shape":[1,6144,128],"sha256":"ddcc3be9324e856df933bb41c062f0e6caede409bb90489ee2d6074f4d9c504b"},{"shape":[1,1536,128],"sha256":"c948ed7641b6d33f7ecc4d0c7f6852934491a236ab17f477bc1f56dcf8dedaca"}],[{"shape":[1,3,10240],"sha256":"066e6dd551f23b3b29768674b2e944fbfffbc3c9a5f7d85495d263c4141e9879"},{"shape":[1,48,128,128],"sha256":"20ef1b5d21386c650a17a16c603ce5fe35d151692c2675e8d9ed3b5d6fda89a8"}],[{"shape":[1,3,10240],"sha256":"90a00040c8ee9cc1673068bcac6ba45712689deb4208ab20134908a84fea6b58"},{"shape":[1,48,128,128],"sha256":"93307906b650609885bb749d1008c99e40e2828b5b3267ec7d7e7c5c574ee3f4"}],[{"shape":[1,3,10240],"sha256":"3cf478361b1c5789eef239323d208b354c841c9a6108739a1309b94746da0c46"},{"shape":[1,48,128,128],"sha256":"8b449c2a069491c0503f4464992a94805fd2d1d2deaa3933943c303a5843ca7a"}],[{"shape":[1,2,6144,256],"sha256":"3d2982295e31380fb6b315ed30523fcb46d44f563fbff93a45367c5954811aad"},{"shape":[1,2,6144,256],"sha256":"38c0b3d272e595a1c39eecebe27dfaf420f4f5a0f5d1592f7fa4bad86b6cc349"},{"shape":[1,6144,128],"sha256":"3cdca5847b112d0cfa1603a76c4243a217969c4796c66b8c14fe6295f25a046e"},{"shape":[1,1536,128],"sha256":"cf89d61f96d9f725954d6552e93a812753cdd92c7b1d765d1ebc48629b26cf66"}],[{"shape":[1,3,10240],"sha256":"2ab38055eaaf0fe3763cc313f7abd70796337d58b4c129a31ed3071f9ca5cc7d"},{"shape":[1,48,128,128],"sha256":"99878b0cdc5cf596bb1ce2cd7b1d38cfcd804adf0d91cdf582d5cd365e1c7c2c"}],[{"shape":[1,3,10240],"sha256":"44fda9c7b95d3563b87c88717a61859041185b2e81fa41961b89af70cd0372ff"},{"shape":[1,48,128,128],"sha256":"2ce386e8156fab9aaeaf86eb0e37c00d479e8022452d0a0e05c988a7c4677f39"}],[{"shape":[1,3,10240],"sha256":"e5f7e76c3b06eb695950dc069a1b6345e1eebccf37197ad2bf231f6989ab64ad"},{"shape":[1,48,128,128],"sha256":"e1453382d6b3f9243b214eee54e009ece8c7ac0421ced60f0c04ce9edcc625ba"}],[{"shape":[1,2,6144,256],"sha256":"c34f8ea34159894eaf1d48a76b168b88e3748120b99e07e87d02a5d2e9c8bfdc"},{"shape":[1,2,6144,256],"sha256":"bbfa7368b5b36af166290f3beb0624d878afc7200417f4d5b0470b641c2c120f"},{"shape":[1,6144,128],"sha256":"85a38cfa7ce8eb1db304927c9426d36e47815e48079a9433391c02c4b99a85f7"},{"shape":[1,1536,128],"sha256":"43652fb3faf823bed96bf2bb3392739374a144670029f05eed26bf69b44c3e2b"}],[{"shape":[1,3,10240],"sha256":"5cd8c927204837c344ba30aa046b12053e3578d009388c9e99810609d4004e74"},{"shape":[1,48,128,128],"sha256":"8f454331b7eb02ba97d3e6c039469e9773728e629e98cd711e5be8494be8edc3"}],[{"shape":[1,3,10240],"sha256":"8ba1d69c528ae75110a2bbc658ba3c03bdfd820774bef21075d3817658ba83ab"},{"shape":[1,48,128,128],"sha256":"e51c85a907a75d4f277835901289446932cd501ce2bfb827b5a6f0ba01b8980f"}],[{"shape":[1,3,10240],"sha256":"e3e068232a99ff18904a6ab49fa856de917a44eadec7aa73cfdb38022b9f9adf"},{"shape":[1,48,128,128],"sha256":"2cc91551ff0fa0eef67ade55d97497488f127eac492582dbcca08cb6add26943"}],[{"shape":[1,2,6144,256],"sha256":"ae8d8be9a7bbe48194288ea3197bc999f38afaac7d5d2204c73a56c3e6051b64"},{"shape":[1,2,6144,256],"sha256":"e4b25387372fbea58b47ba49bbfb503da7840936e7a8bcaf7dd853e0589d522c"},{"shape":[1,6144,128],"sha256":"0c74027a347a51f28f3ab7e63da2950496008b5e38708ba5745b0bfc30f7cf62"},{"shape":[1,1536,128],"sha256":"782ad68a1f9d3e0c4ada64fa06539d60c0a466078c12f94189860fb219429253"}]]},"hidden":{"shape":[1,1,10240],"sha256":"6171242b7ff819c0d09d139f753f4a97cd624fd9f5e593dbf7ed9aab553a0c5f"}} \ No newline at end of file diff --git a/docs/issue112-row-map/kernel-and-oracle-receipts.json b/docs/issue112-row-map/kernel-and-oracle-receipts.json new file mode 100644 index 0000000..ab664e4 --- /dev/null +++ b/docs/issue112-row-map/kernel-and-oracle-receipts.json @@ -0,0 +1,3451 @@ +{ + "final-variants": [ + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 32, + "separate": false, + "rows": 4096, + "sha256": "87e6674633b3fda820465314583f848e128cdd685604568867a3dded9887baa7", + "canaries": 1, + "calls": 1 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 32, + "separate": false, + "rows": 8193, + "sha256": "aa9d22159a4decaf8d7fe14006f12c74b4e256b0fd5c30dc9a8825fc94f95cdc", + "canaries": 2, + "calls": 2 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 32, + "separate": false, + "rows": 32769, + "sha256": "7ba10bf1c31241dd093948043d13d35453194cbe39271f11b7540b41fbf549a0", + "canaries": 2, + "calls": 3 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 32, + "separate": true, + "rows": 4096, + "sha256": "3406fdf5b03327563c3c30e7a909af4e824c4a600b86cfeea19f3608ea046c98", + "canaries": 3, + "calls": 4 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 32, + "separate": true, + "rows": 8193, + "sha256": "5fa9189db8d7606ba0770f798034384659cbd40842ea0a0e768894b09c5a1d96", + "canaries": 4, + "calls": 5 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 32, + "separate": true, + "rows": 32769, + "sha256": "6366d68242a79e36006219b09b09229166e9f53cc712a07c94219cf2ca0ab5aa", + "canaries": 4, + "calls": 6 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 64, + "separate": false, + "rows": 4096, + "sha256": "345da338b05d63507a4d21b11649f4f13bb1d1847258c5f328f0f20537925234", + "canaries": 5, + "calls": 7 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 64, + "separate": false, + "rows": 8193, + "sha256": "f3e43e86da4c95ea863dd0b56bf29149cb141600b447f81a48dbc447d00649c1", + "canaries": 6, + "calls": 8 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 64, + "separate": false, + "rows": 32769, + "sha256": "49d28062079dd4fb5a11e9ed1d57c49762b999b035bbdc703a5bce5fcafc1489", + "canaries": 6, + "calls": 9 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 64, + "separate": true, + "rows": 4096, + "sha256": "741a0281710ad77408c23332c94a51e87086bf924e11e5d17d2a3102b4ce9dba", + "canaries": 7, + "calls": 10 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 64, + "separate": true, + "rows": 8193, + "sha256": "8aff6b3ad1ca937e1ff2ba16eecf8c2fcb0195cd0b79e47d9b7547d720094008", + "canaries": 8, + "calls": 11 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 64, + "separate": true, + "rows": 32769, + "sha256": "3917e3fba412e0d02501d372af11e4fc6e64bc78d4c7984806ab7c5f7add52e8", + "canaries": 8, + "calls": 12 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 128, + "separate": false, + "rows": 4096, + "sha256": "ab084f7aa6ec4b02968a7aa53ee19bea199ae5e6b454968cb9814a347bf15da4", + "canaries": 9, + "calls": 13 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 128, + "separate": false, + "rows": 8193, + "sha256": "119e497a1b747b884d4363ac84e32029c92774999ae2ed247682c471fb6d3107", + "canaries": 10, + "calls": 14 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 128, + "separate": false, + "rows": 32769, + "sha256": "98d0721bb5159bb0cf8160822df70a5fdfc432f80689c4bc9e7f04ea9d89bab7", + "canaries": 10, + "calls": 15 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 128, + "separate": true, + "rows": 4096, + "sha256": "6fa7c64577dae1781dd1cd2ed0881355ca705a7a0c213cb37b4def94cb9c5ada", + "canaries": 11, + "calls": 16 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 128, + "separate": true, + "rows": 8193, + "sha256": "d6e720868b169009e060ba154256b9576f334ebc72071e5cc822126c5b406bb5", + "canaries": 12, + "calls": 17 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 128, + "separate": true, + "rows": 32769, + "sha256": "66e384908539fc9cab2514931b63febb55e9a63cd30be40672403a388c6d31d9", + "canaries": 12, + "calls": 18 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 32, + "separate": false, + "rows": 4096, + "sha256": "2d0a96e27ea4f7cc1c6038bb195d7227d328a7a701d07f02fc9e8e6ba06177d2", + "canaries": 13, + "calls": 19 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 32, + "separate": false, + "rows": 8193, + "sha256": "4ef690a7bf94fe52a1c569fc35eef1763673595975b4fc672bd3966f16ea6ec6", + "canaries": 14, + "calls": 20 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 32, + "separate": false, + "rows": 32769, + "sha256": "6480a8f856fff8285cedbd513c1531990465f03d6e93953771aedffaec0a7ff3", + "canaries": 14, + "calls": 21 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 32, + "separate": true, + "rows": 4096, + "sha256": "592d49406f26e8f2528d1032bf233ca6de2ad6f5fd0b2e7cc82ae9abd3ed98de", + "canaries": 15, + "calls": 22 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 32, + "separate": true, + "rows": 8193, + "sha256": "12f64490273dbc9e23e0833634f429c35e56547ff1c1f85d77f93a87a45095b0", + "canaries": 16, + "calls": 23 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 32, + "separate": true, + "rows": 32769, + "sha256": "4a740d36611bbcfb4ee28a0c43072e4fee3f8f0941b4a1d159dff427bb8d61e3", + "canaries": 16, + "calls": 24 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 64, + "separate": false, + "rows": 4096, + "sha256": "c7cd3dd4983b2b8ab0aa873ec9c09015b3064f8c188366c4b4d756bc3c5c404d", + "canaries": 17, + "calls": 25 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 64, + "separate": false, + "rows": 8193, + "sha256": "4d8669778c9729d7cffc35e4b85b3b4c7a6d761f180344461e263f384a3f347d", + "canaries": 18, + "calls": 26 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 64, + "separate": false, + "rows": 32769, + "sha256": "262fa7904544cac326cb40585c70d7af0383599749b0c955ccf7c8c36d3d2464", + "canaries": 18, + "calls": 27 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 64, + "separate": true, + "rows": 4096, + "sha256": "bdd38a0e45f0ea95d74f74cf59ac0c563b105d4516b23f9803a9b181c148c42d", + "canaries": 19, + "calls": 28 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 64, + "separate": true, + "rows": 8193, + "sha256": "efd8ff2402d190f40e9c44f3a42fe520619c1789b3e06badd2bcce496d84cf53", + "canaries": 20, + "calls": 29 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 64, + "separate": true, + "rows": 32769, + "sha256": "3e8d6b79096984a0dfdd0fb7a0c6167b32bfbb38bde85af64bf9255a8c279077", + "canaries": 20, + "calls": 30 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 128, + "separate": false, + "rows": 4096, + "sha256": "225a94b854ab844f7adb07726f0feffc65e5a8cc432a8df6eb5ffc65a5de0d47", + "canaries": 21, + "calls": 31 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 128, + "separate": false, + "rows": 8193, + "sha256": "5c64fbb3da7dc9fce85932968f1d30f01d7a4fd8e33257aaaa8bdff027412c87", + "canaries": 22, + "calls": 32 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 128, + "separate": false, + "rows": 32769, + "sha256": "92d791f5b515cc08bfdf1adde826c91200c1b0bdc8bd833e471e4311f43f676e", + "canaries": 22, + "calls": 33 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 128, + "separate": true, + "rows": 4096, + "sha256": "253f4d69e8752d28f5271e40cf22464d6b9500da92b25183dc8aef89ce04ddc4", + "canaries": 23, + "calls": 34 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 128, + "separate": true, + "rows": 8193, + "sha256": "f98eded21e947d39619a531976821211c7d9f533b18fa47da72974242c9186ff", + "canaries": 24, + "calls": 35 + }, + { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 128, + "separate": true, + "rows": 32769, + "sha256": "ed30ed579cd1da0756d58026d88b3642fb93354d5e33df5517a5b7484ce039aa", + "canaries": 24, + "calls": 36 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 32, + "separate": false, + "rows": 4096, + "sha256": "5cecafa71b8992aa745e38af7316a544257ac5a04862c60e765b93ceab845f61", + "canaries": 25, + "calls": 37 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 32, + "separate": false, + "rows": 8193, + "sha256": "27c4cf2e50878d98809baa194c6b5197054038e46241a9572cc5cf7e959b6ad3", + "canaries": 26, + "calls": 38 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 32, + "separate": false, + "rows": 32769, + "sha256": "3405212b2c030c460a9b2c80205e1613b1f70f7251f56f87bf6fa93be6cf6167", + "canaries": 26, + "calls": 39 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 32, + "separate": true, + "rows": 4096, + "sha256": "71deba9960ee7681a53a06f7370cc9e7937784dab7a573f428f7de89e44f64ab", + "canaries": 27, + "calls": 40 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 32, + "separate": true, + "rows": 8193, + "sha256": "60094df7f2d7da47f071f4fadbbdf3ceb9626417a302f881ed2159a10d4e52bf", + "canaries": 28, + "calls": 41 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 32, + "separate": true, + "rows": 32769, + "sha256": "995186fe31c698996353d2b4a8fbc3238e4244d60672ba3e571c35a6db186d0c", + "canaries": 28, + "calls": 42 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 64, + "separate": false, + "rows": 4096, + "sha256": "48312489698425ee000325cc49bf01abfe4126a6049f36f14b55040fe904c70c", + "canaries": 29, + "calls": 43 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 64, + "separate": false, + "rows": 8193, + "sha256": "8d240023151a2c88691dcd379a0e61bc38928a49607b3ad7d584c6c0211f177d", + "canaries": 30, + "calls": 44 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 64, + "separate": false, + "rows": 32769, + "sha256": "03f6e1871e7f3cbbb5453edbdc921642db88ac9603091e3d247d8b841a04e7e3", + "canaries": 30, + "calls": 45 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 64, + "separate": true, + "rows": 4096, + "sha256": "4f736ec62c82692f1090dd24387b8406f02794b3acc40fd589cb5afe9ac5b903", + "canaries": 31, + "calls": 46 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 64, + "separate": true, + "rows": 8193, + "sha256": "feefb0449c6c267b1d486d6211349a99df5af7625bd8a03c001be4cf03cbd6c1", + "canaries": 32, + "calls": 47 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 64, + "separate": true, + "rows": 32769, + "sha256": "8bcbee82fdc3bccbda34cdf17932b16bec7ca36515198091a1d8522a68d6c00d", + "canaries": 32, + "calls": 48 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 128, + "separate": false, + "rows": 4096, + "sha256": "7fc4098399ef9f684845d11b9cd5182ce7ed043c2a173b3b9ff8853aa088ea9f", + "canaries": 33, + "calls": 49 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 128, + "separate": false, + "rows": 8193, + "sha256": "1f1a5fdcf377f7ec804fa548d7f3d132f90a0390521cc5d3b292ea7477725eda", + "canaries": 34, + "calls": 50 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 128, + "separate": false, + "rows": 32769, + "sha256": "92804a5b7bf7bf71bfb41d4f949b3af977ad9cae968daede5f55126801d9679f", + "canaries": 34, + "calls": 51 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 128, + "separate": true, + "rows": 4096, + "sha256": "34253453970278db06f67aed22650bac050dc1e6d53eced0029d67eb74b52f44", + "canaries": 35, + "calls": 52 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 128, + "separate": true, + "rows": 8193, + "sha256": "b34d40e1684767f83d13ce5bbd56b361264e58cab2c413d813b09168a9b8c7a1", + "canaries": 36, + "calls": 53 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 128, + "separate": true, + "rows": 32769, + "sha256": "34b966da4050409b08f540bb90fd2140420b5ea1b39e4e19aa26c59aa0fbc66b", + "canaries": 36, + "calls": 54 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 32, + "separate": false, + "rows": 4096, + "sha256": "edac062cba0e971069df93922bc5b7cbce80d1a5d168a55be3150a56c31c20ef", + "canaries": 37, + "calls": 55 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 32, + "separate": false, + "rows": 8193, + "sha256": "49328e01d1cbbbd7a8d4330f9da8942e7e5c5d288cadc918f533205ed9bd9d11", + "canaries": 38, + "calls": 56 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 32, + "separate": false, + "rows": 32769, + "sha256": "39ef9f030ba50a0a7fbf868972cda047ef0c7a05db3cdd950a742be07530674d", + "canaries": 38, + "calls": 57 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 32, + "separate": true, + "rows": 4096, + "sha256": "a1b475830c5f4f00afc87f760c840731d733e74189ad3da73e19e7b9e2c26ab5", + "canaries": 39, + "calls": 58 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 32, + "separate": true, + "rows": 8193, + "sha256": "f1e63fe22be3ddcd6e0ad39e535650da32e5615b7634de4428a3a25b8b2a3b68", + "canaries": 40, + "calls": 59 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 32, + "separate": true, + "rows": 32769, + "sha256": "5030aa3e2fa7a8fecd071cdd9968cd06f32e749c0918104564194673765ba958", + "canaries": 40, + "calls": 60 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 64, + "separate": false, + "rows": 4096, + "sha256": "fe7e5f9c8e1f359967462c90e26a1a4b6d5c069f8f86f64cb40d3ad42e7efa4a", + "canaries": 41, + "calls": 61 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 64, + "separate": false, + "rows": 8193, + "sha256": "a4557ad84cdb1c8ce458a0f87b317fb43757768e0b130d48412cd7eeab229223", + "canaries": 42, + "calls": 62 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 64, + "separate": false, + "rows": 32769, + "sha256": "04957d2e41c1e55a735d0e11e9e9720a71f08880e57ce9c0872e25aa240c338a", + "canaries": 42, + "calls": 63 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 64, + "separate": true, + "rows": 4096, + "sha256": "697ed33f622ad0b27bf9ab2a3a0b16fadf94c932a2d34ad6b934247547939e43", + "canaries": 43, + "calls": 64 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 64, + "separate": true, + "rows": 8193, + "sha256": "d0999e742e62d0181ad9936b19ddbf8e0db722c250d4321d24781833b3e1cf98", + "canaries": 44, + "calls": 65 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 64, + "separate": true, + "rows": 32769, + "sha256": "3361d9b39f5de162f1cf3aeab42f070b95f3b9cb561773f5313234df0235fbca", + "canaries": 44, + "calls": 66 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 128, + "separate": false, + "rows": 4096, + "sha256": "0b429863a69f86b77b5613a948ff56ef893a817af418bc606004109cdb77ee45", + "canaries": 45, + "calls": 67 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 128, + "separate": false, + "rows": 8193, + "sha256": "1b0ed0f2ec8d12de2514d5296e88d5f265cf669372cda808664e2af5209035ba", + "canaries": 46, + "calls": 68 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 128, + "separate": false, + "rows": 32769, + "sha256": "6776c23952ecea1417a357d69815724072fd9f5a9ead32be9ef406bf8adaf659", + "canaries": 46, + "calls": 69 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 128, + "separate": true, + "rows": 4096, + "sha256": "b5a9678f8bbc238f6f23e838bc1981fe810648033e457fedd87ff5e838481fe6", + "canaries": 47, + "calls": 70 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 128, + "separate": true, + "rows": 8193, + "sha256": "27062b42ed3f032ac2d4b69919003b45a4e4f167454d7b476f3362b44c95e9bc", + "canaries": 48, + "calls": 71 + }, + { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 128, + "separate": true, + "rows": 32769, + "sha256": "88dace4dc674dcb6ac4650519ceb1974a1d23f20603d76b224a541fd4c6b0ee4", + "canaries": 48, + "calls": 72 + } + ], + "final-failures": [ + { + "case": "sticky_fallback", + "failure": 1, + "separate": false, + "canaries": 2, + "failures": 2, + "fallbacks": 4, + "exact": true + }, + { + "case": "sticky_fallback", + "failure": 1, + "separate": true, + "canaries": 3, + "failures": 3, + "fallbacks": 6, + "exact": true + }, + { + "case": "sticky_fallback", + "failure": 2, + "separate": false, + "canaries": 5, + "failures": 5, + "fallbacks": 10, + "exact": true + }, + { + "case": "sticky_fallback", + "failure": 2, + "separate": true, + "canaries": 6, + "failures": 6, + "fallbacks": 12, + "exact": true + }, + { + "case": "sticky_fallback", + "failure": 3, + "separate": false, + "canaries": 8, + "failures": 8, + "fallbacks": 16, + "exact": true + }, + { + "case": "sticky_fallback", + "failure": 3, + "separate": true, + "canaries": 9, + "failures": 9, + "fallbacks": 18, + "exact": true + } + ], + "final-installed": [ + { + "case": "installed_gate_up", + "tokens": 410, + "rows": 4100, + "separate": false, + "sha256": "d61fba05a3358a85eba2bd4ecbff3b9fc9dd3ff7651d56aaec5b691b2808b3f0", + "canaries": 1, + "calls": 1, + "exact": true + }, + { + "case": "installed_gate_up", + "tokens": 410, + "rows": 4100, + "separate": true, + "sha256": "d61fba05a3358a85eba2bd4ecbff3b9fc9dd3ff7651d56aaec5b691b2808b3f0", + "canaries": 2, + "calls": 2, + "exact": true + }, + { + "case": "installed_gate_up", + "tokens": 2048, + "rows": 20480, + "separate": false, + "sha256": "c53aac85f49f4c1b6c11e3da858d2abf4e43de241bf3c0347d2590d0181e2249", + "canaries": 2, + "calls": 3, + "exact": true + }, + { + "case": "installed_gate_up", + "tokens": 2048, + "rows": 20480, + "separate": true, + "sha256": "c53aac85f49f4c1b6c11e3da858d2abf4e43de241bf3c0347d2590d0181e2249", + "canaries": 2, + "calls": 4, + "exact": true + }, + { + "case": "installed_gate_up", + "tokens": 3277, + "rows": 32770, + "separate": false, + "sha256": "10f573d0eaf5169475781c4f75eb923fa06d7f88d1684a6d5d2ce8acfdc526a4", + "canaries": 3, + "calls": 5, + "exact": true + }, + { + "case": "installed_gate_up", + "tokens": 3277, + "rows": 32770, + "separate": true, + "sha256": "10f573d0eaf5169475781c4f75eb923fa06d7f88d1684a6d5d2ce8acfdc526a4", + "canaries": 4, + "calls": 6, + "exact": true + }, + { + "case": "installed_gate_up", + "tokens": 4095, + "rows": 40950, + "separate": false, + "sha256": "738212404e537f0608d4e9c9b8d0e5ff2061587197c3391b1220975f93dd8d9f", + "canaries": 4, + "calls": 7, + "exact": true + }, + { + "case": "installed_gate_up", + "tokens": 4095, + "rows": 40950, + "separate": true, + "sha256": "738212404e537f0608d4e9c9b8d0e5ff2061587197c3391b1220975f93dd8d9f", + "canaries": 4, + "calls": 8, + "exact": true + }, + { + "case": "installed_gate_up", + "tokens": 4096, + "rows": 40960, + "separate": false, + "sha256": "e1a6630ec5cd7e523c98eb352e328560fdd733a640fc7dd69a5a96e14b462d15", + "canaries": 4, + "calls": 9, + "exact": true + }, + { + "case": "installed_gate_up", + "tokens": 4096, + "rows": 40960, + "separate": true, + "sha256": "e1a6630ec5cd7e523c98eb352e328560fdd733a640fc7dd69a5a96e14b462d15", + "canaries": 4, + "calls": 10, + "exact": true + }, + { + "case": "installed_gate_up", + "tokens": 8192, + "rows": 81920, + "separate": false, + "sha256": "05f7708e9824f26a4f82567c6c94d494bb717edbd72b3dcf39205922c0624cf0", + "canaries": 4, + "calls": 11, + "exact": true + }, + { + "case": "installed_gate_up", + "tokens": 8192, + "rows": 81920, + "separate": true, + "sha256": "05f7708e9824f26a4f82567c6c94d494bb717edbd72b3dcf39205922c0624cf0", + "canaries": 4, + "calls": 12, + "exact": true + } + ], + "final-variants-oracle": [ + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 32, + "separate": false, + "rows": 4096, + "sha256": "87e6674633b3fda820465314583f848e128cdd685604568867a3dded9887baa7", + "canaries": 1, + "calls": 1 + }, + "exact": true, + "kernel_before": { + "calls": 0, + "fallbacks": 0, + "canaries": 0, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 1, + "fallbacks": 0, + "canaries": 1, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 32, + "separate": false, + "rows": 8193, + "sha256": "aa9d22159a4decaf8d7fe14006f12c74b4e256b0fd5c30dc9a8825fc94f95cdc", + "canaries": 2, + "calls": 2 + }, + "exact": true, + "kernel_before": { + "calls": 1, + "fallbacks": 0, + "canaries": 1, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 2, + "fallbacks": 0, + "canaries": 2, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 32, + "separate": false, + "rows": 32769, + "sha256": "7ba10bf1c31241dd093948043d13d35453194cbe39271f11b7540b41fbf549a0", + "canaries": 2, + "calls": 3 + }, + "exact": true, + "kernel_before": { + "calls": 2, + "fallbacks": 0, + "canaries": 2, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 3, + "fallbacks": 0, + "canaries": 2, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 32, + "separate": true, + "rows": 4096, + "sha256": "3406fdf5b03327563c3c30e7a909af4e824c4a600b86cfeea19f3608ea046c98", + "canaries": 3, + "calls": 4 + }, + "exact": true, + "kernel_before": { + "calls": 3, + "fallbacks": 0, + "canaries": 2, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 4, + "fallbacks": 0, + "canaries": 3, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 32, + "separate": true, + "rows": 8193, + "sha256": "5fa9189db8d7606ba0770f798034384659cbd40842ea0a0e768894b09c5a1d96", + "canaries": 4, + "calls": 5 + }, + "exact": true, + "kernel_before": { + "calls": 4, + "fallbacks": 0, + "canaries": 3, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 5, + "fallbacks": 0, + "canaries": 4, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 32, + "separate": true, + "rows": 32769, + "sha256": "6366d68242a79e36006219b09b09229166e9f53cc712a07c94219cf2ca0ab5aa", + "canaries": 4, + "calls": 6 + }, + "exact": true, + "kernel_before": { + "calls": 5, + "fallbacks": 0, + "canaries": 4, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 6, + "fallbacks": 0, + "canaries": 4, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 64, + "separate": false, + "rows": 4096, + "sha256": "345da338b05d63507a4d21b11649f4f13bb1d1847258c5f328f0f20537925234", + "canaries": 5, + "calls": 7 + }, + "exact": true, + "kernel_before": { + "calls": 6, + "fallbacks": 0, + "canaries": 4, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 7, + "fallbacks": 0, + "canaries": 5, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 64, + "separate": false, + "rows": 8193, + "sha256": "f3e43e86da4c95ea863dd0b56bf29149cb141600b447f81a48dbc447d00649c1", + "canaries": 6, + "calls": 8 + }, + "exact": true, + "kernel_before": { + "calls": 7, + "fallbacks": 0, + "canaries": 5, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 8, + "fallbacks": 0, + "canaries": 6, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 64, + "separate": false, + "rows": 32769, + "sha256": "49d28062079dd4fb5a11e9ed1d57c49762b999b035bbdc703a5bce5fcafc1489", + "canaries": 6, + "calls": 9 + }, + "exact": true, + "kernel_before": { + "calls": 8, + "fallbacks": 0, + "canaries": 6, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 9, + "fallbacks": 0, + "canaries": 6, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 64, + "separate": true, + "rows": 4096, + "sha256": "741a0281710ad77408c23332c94a51e87086bf924e11e5d17d2a3102b4ce9dba", + "canaries": 7, + "calls": 10 + }, + "exact": true, + "kernel_before": { + "calls": 9, + "fallbacks": 0, + "canaries": 6, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 10, + "fallbacks": 0, + "canaries": 7, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 64, + "separate": true, + "rows": 8193, + "sha256": "8aff6b3ad1ca937e1ff2ba16eecf8c2fcb0195cd0b79e47d9b7547d720094008", + "canaries": 8, + "calls": 11 + }, + "exact": true, + "kernel_before": { + "calls": 10, + "fallbacks": 0, + "canaries": 7, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 11, + "fallbacks": 0, + "canaries": 8, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 64, + "separate": true, + "rows": 32769, + "sha256": "3917e3fba412e0d02501d372af11e4fc6e64bc78d4c7984806ab7c5f7add52e8", + "canaries": 8, + "calls": 12 + }, + "exact": true, + "kernel_before": { + "calls": 11, + "fallbacks": 0, + "canaries": 8, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 12, + "fallbacks": 0, + "canaries": 8, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 128, + "separate": false, + "rows": 4096, + "sha256": "ab084f7aa6ec4b02968a7aa53ee19bea199ae5e6b454968cb9814a347bf15da4", + "canaries": 9, + "calls": 13 + }, + "exact": true, + "kernel_before": { + "calls": 12, + "fallbacks": 0, + "canaries": 8, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 13, + "fallbacks": 0, + "canaries": 9, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 128, + "separate": false, + "rows": 8193, + "sha256": "119e497a1b747b884d4363ac84e32029c92774999ae2ed247682c471fb6d3107", + "canaries": 10, + "calls": 14 + }, + "exact": true, + "kernel_before": { + "calls": 13, + "fallbacks": 0, + "canaries": 9, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 14, + "fallbacks": 0, + "canaries": 10, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 128, + "separate": false, + "rows": 32769, + "sha256": "98d0721bb5159bb0cf8160822df70a5fdfc432f80689c4bc9e7f04ea9d89bab7", + "canaries": 10, + "calls": 15 + }, + "exact": true, + "kernel_before": { + "calls": 14, + "fallbacks": 0, + "canaries": 10, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 15, + "fallbacks": 0, + "canaries": 10, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 128, + "separate": true, + "rows": 4096, + "sha256": "6fa7c64577dae1781dd1cd2ed0881355ca705a7a0c213cb37b4def94cb9c5ada", + "canaries": 11, + "calls": 16 + }, + "exact": true, + "kernel_before": { + "calls": 15, + "fallbacks": 0, + "canaries": 10, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 16, + "fallbacks": 0, + "canaries": 11, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 128, + "separate": true, + "rows": 8193, + "sha256": "d6e720868b169009e060ba154256b9576f334ebc72071e5cc822126c5b406bb5", + "canaries": 12, + "calls": 17 + }, + "exact": true, + "kernel_before": { + "calls": 16, + "fallbacks": 0, + "canaries": 11, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 17, + "fallbacks": 0, + "canaries": 12, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 4, + "group": 128, + "separate": true, + "rows": 32769, + "sha256": "66e384908539fc9cab2514931b63febb55e9a63cd30be40672403a388c6d31d9", + "canaries": 12, + "calls": 18 + }, + "exact": true, + "kernel_before": { + "calls": 17, + "fallbacks": 0, + "canaries": 12, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 18, + "fallbacks": 0, + "canaries": 12, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 32, + "separate": false, + "rows": 4096, + "sha256": "2d0a96e27ea4f7cc1c6038bb195d7227d328a7a701d07f02fc9e8e6ba06177d2", + "canaries": 13, + "calls": 19 + }, + "exact": true, + "kernel_before": { + "calls": 18, + "fallbacks": 0, + "canaries": 12, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 19, + "fallbacks": 0, + "canaries": 13, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 32, + "separate": false, + "rows": 8193, + "sha256": "4ef690a7bf94fe52a1c569fc35eef1763673595975b4fc672bd3966f16ea6ec6", + "canaries": 14, + "calls": 20 + }, + "exact": true, + "kernel_before": { + "calls": 19, + "fallbacks": 0, + "canaries": 13, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 20, + "fallbacks": 0, + "canaries": 14, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 32, + "separate": false, + "rows": 32769, + "sha256": "6480a8f856fff8285cedbd513c1531990465f03d6e93953771aedffaec0a7ff3", + "canaries": 14, + "calls": 21 + }, + "exact": true, + "kernel_before": { + "calls": 20, + "fallbacks": 0, + "canaries": 14, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 21, + "fallbacks": 0, + "canaries": 14, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 32, + "separate": true, + "rows": 4096, + "sha256": "592d49406f26e8f2528d1032bf233ca6de2ad6f5fd0b2e7cc82ae9abd3ed98de", + "canaries": 15, + "calls": 22 + }, + "exact": true, + "kernel_before": { + "calls": 21, + "fallbacks": 0, + "canaries": 14, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 22, + "fallbacks": 0, + "canaries": 15, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 32, + "separate": true, + "rows": 8193, + "sha256": "12f64490273dbc9e23e0833634f429c35e56547ff1c1f85d77f93a87a45095b0", + "canaries": 16, + "calls": 23 + }, + "exact": true, + "kernel_before": { + "calls": 22, + "fallbacks": 0, + "canaries": 15, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 23, + "fallbacks": 0, + "canaries": 16, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 32, + "separate": true, + "rows": 32769, + "sha256": "4a740d36611bbcfb4ee28a0c43072e4fee3f8f0941b4a1d159dff427bb8d61e3", + "canaries": 16, + "calls": 24 + }, + "exact": true, + "kernel_before": { + "calls": 23, + "fallbacks": 0, + "canaries": 16, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 24, + "fallbacks": 0, + "canaries": 16, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 64, + "separate": false, + "rows": 4096, + "sha256": "c7cd3dd4983b2b8ab0aa873ec9c09015b3064f8c188366c4b4d756bc3c5c404d", + "canaries": 17, + "calls": 25 + }, + "exact": true, + "kernel_before": { + "calls": 24, + "fallbacks": 0, + "canaries": 16, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 25, + "fallbacks": 0, + "canaries": 17, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 64, + "separate": false, + "rows": 8193, + "sha256": "4d8669778c9729d7cffc35e4b85b3b4c7a6d761f180344461e263f384a3f347d", + "canaries": 18, + "calls": 26 + }, + "exact": true, + "kernel_before": { + "calls": 25, + "fallbacks": 0, + "canaries": 17, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 26, + "fallbacks": 0, + "canaries": 18, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 64, + "separate": false, + "rows": 32769, + "sha256": "262fa7904544cac326cb40585c70d7af0383599749b0c955ccf7c8c36d3d2464", + "canaries": 18, + "calls": 27 + }, + "exact": true, + "kernel_before": { + "calls": 26, + "fallbacks": 0, + "canaries": 18, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 27, + "fallbacks": 0, + "canaries": 18, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 64, + "separate": true, + "rows": 4096, + "sha256": "bdd38a0e45f0ea95d74f74cf59ac0c563b105d4516b23f9803a9b181c148c42d", + "canaries": 19, + "calls": 28 + }, + "exact": true, + "kernel_before": { + "calls": 27, + "fallbacks": 0, + "canaries": 18, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 28, + "fallbacks": 0, + "canaries": 19, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 64, + "separate": true, + "rows": 8193, + "sha256": "efd8ff2402d190f40e9c44f3a42fe520619c1789b3e06badd2bcce496d84cf53", + "canaries": 20, + "calls": 29 + }, + "exact": true, + "kernel_before": { + "calls": 28, + "fallbacks": 0, + "canaries": 19, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 29, + "fallbacks": 0, + "canaries": 20, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 64, + "separate": true, + "rows": 32769, + "sha256": "3e8d6b79096984a0dfdd0fb7a0c6167b32bfbb38bde85af64bf9255a8c279077", + "canaries": 20, + "calls": 30 + }, + "exact": true, + "kernel_before": { + "calls": 29, + "fallbacks": 0, + "canaries": 20, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 30, + "fallbacks": 0, + "canaries": 20, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 128, + "separate": false, + "rows": 4096, + "sha256": "225a94b854ab844f7adb07726f0feffc65e5a8cc432a8df6eb5ffc65a5de0d47", + "canaries": 21, + "calls": 31 + }, + "exact": true, + "kernel_before": { + "calls": 30, + "fallbacks": 0, + "canaries": 20, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 31, + "fallbacks": 0, + "canaries": 21, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 128, + "separate": false, + "rows": 8193, + "sha256": "5c64fbb3da7dc9fce85932968f1d30f01d7a4fd8e33257aaaa8bdff027412c87", + "canaries": 22, + "calls": 32 + }, + "exact": true, + "kernel_before": { + "calls": 31, + "fallbacks": 0, + "canaries": 21, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 32, + "fallbacks": 0, + "canaries": 22, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 128, + "separate": false, + "rows": 32769, + "sha256": "92d791f5b515cc08bfdf1adde826c91200c1b0bdc8bd833e471e4311f43f676e", + "canaries": 22, + "calls": 33 + }, + "exact": true, + "kernel_before": { + "calls": 32, + "fallbacks": 0, + "canaries": 22, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 33, + "fallbacks": 0, + "canaries": 22, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 128, + "separate": true, + "rows": 4096, + "sha256": "253f4d69e8752d28f5271e40cf22464d6b9500da92b25183dc8aef89ce04ddc4", + "canaries": 23, + "calls": 34 + }, + "exact": true, + "kernel_before": { + "calls": 33, + "fallbacks": 0, + "canaries": 22, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 34, + "fallbacks": 0, + "canaries": 23, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 128, + "separate": true, + "rows": 8193, + "sha256": "f98eded21e947d39619a531976821211c7d9f533b18fa47da72974242c9186ff", + "canaries": 24, + "calls": 35 + }, + "exact": true, + "kernel_before": { + "calls": 34, + "fallbacks": 0, + "canaries": 23, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 35, + "fallbacks": 0, + "canaries": 24, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "BF16", + "bits": 8, + "group": 128, + "separate": true, + "rows": 32769, + "sha256": "ed30ed579cd1da0756d58026d88b3642fb93354d5e33df5517a5b7484ce039aa", + "canaries": 24, + "calls": 36 + }, + "exact": true, + "kernel_before": { + "calls": 35, + "fallbacks": 0, + "canaries": 24, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 36, + "fallbacks": 0, + "canaries": 24, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 32, + "separate": false, + "rows": 4096, + "sha256": "5cecafa71b8992aa745e38af7316a544257ac5a04862c60e765b93ceab845f61", + "canaries": 25, + "calls": 37 + }, + "exact": true, + "kernel_before": { + "calls": 36, + "fallbacks": 0, + "canaries": 24, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 37, + "fallbacks": 0, + "canaries": 25, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 32, + "separate": false, + "rows": 8193, + "sha256": "27c4cf2e50878d98809baa194c6b5197054038e46241a9572cc5cf7e959b6ad3", + "canaries": 26, + "calls": 38 + }, + "exact": true, + "kernel_before": { + "calls": 37, + "fallbacks": 0, + "canaries": 25, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 38, + "fallbacks": 0, + "canaries": 26, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 32, + "separate": false, + "rows": 32769, + "sha256": "3405212b2c030c460a9b2c80205e1613b1f70f7251f56f87bf6fa93be6cf6167", + "canaries": 26, + "calls": 39 + }, + "exact": true, + "kernel_before": { + "calls": 38, + "fallbacks": 0, + "canaries": 26, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 39, + "fallbacks": 0, + "canaries": 26, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 32, + "separate": true, + "rows": 4096, + "sha256": "71deba9960ee7681a53a06f7370cc9e7937784dab7a573f428f7de89e44f64ab", + "canaries": 27, + "calls": 40 + }, + "exact": true, + "kernel_before": { + "calls": 39, + "fallbacks": 0, + "canaries": 26, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 40, + "fallbacks": 0, + "canaries": 27, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 32, + "separate": true, + "rows": 8193, + "sha256": "60094df7f2d7da47f071f4fadbbdf3ceb9626417a302f881ed2159a10d4e52bf", + "canaries": 28, + "calls": 41 + }, + "exact": true, + "kernel_before": { + "calls": 40, + "fallbacks": 0, + "canaries": 27, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 41, + "fallbacks": 0, + "canaries": 28, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 32, + "separate": true, + "rows": 32769, + "sha256": "995186fe31c698996353d2b4a8fbc3238e4244d60672ba3e571c35a6db186d0c", + "canaries": 28, + "calls": 42 + }, + "exact": true, + "kernel_before": { + "calls": 41, + "fallbacks": 0, + "canaries": 28, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 42, + "fallbacks": 0, + "canaries": 28, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 64, + "separate": false, + "rows": 4096, + "sha256": "48312489698425ee000325cc49bf01abfe4126a6049f36f14b55040fe904c70c", + "canaries": 29, + "calls": 43 + }, + "exact": true, + "kernel_before": { + "calls": 42, + "fallbacks": 0, + "canaries": 28, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 43, + "fallbacks": 0, + "canaries": 29, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 64, + "separate": false, + "rows": 8193, + "sha256": "8d240023151a2c88691dcd379a0e61bc38928a49607b3ad7d584c6c0211f177d", + "canaries": 30, + "calls": 44 + }, + "exact": true, + "kernel_before": { + "calls": 43, + "fallbacks": 0, + "canaries": 29, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 44, + "fallbacks": 0, + "canaries": 30, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 64, + "separate": false, + "rows": 32769, + "sha256": "03f6e1871e7f3cbbb5453edbdc921642db88ac9603091e3d247d8b841a04e7e3", + "canaries": 30, + "calls": 45 + }, + "exact": true, + "kernel_before": { + "calls": 44, + "fallbacks": 0, + "canaries": 30, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 45, + "fallbacks": 0, + "canaries": 30, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 64, + "separate": true, + "rows": 4096, + "sha256": "4f736ec62c82692f1090dd24387b8406f02794b3acc40fd589cb5afe9ac5b903", + "canaries": 31, + "calls": 46 + }, + "exact": true, + "kernel_before": { + "calls": 45, + "fallbacks": 0, + "canaries": 30, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 46, + "fallbacks": 0, + "canaries": 31, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 64, + "separate": true, + "rows": 8193, + "sha256": "feefb0449c6c267b1d486d6211349a99df5af7625bd8a03c001be4cf03cbd6c1", + "canaries": 32, + "calls": 47 + }, + "exact": true, + "kernel_before": { + "calls": 46, + "fallbacks": 0, + "canaries": 31, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 47, + "fallbacks": 0, + "canaries": 32, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 64, + "separate": true, + "rows": 32769, + "sha256": "8bcbee82fdc3bccbda34cdf17932b16bec7ca36515198091a1d8522a68d6c00d", + "canaries": 32, + "calls": 48 + }, + "exact": true, + "kernel_before": { + "calls": 47, + "fallbacks": 0, + "canaries": 32, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 48, + "fallbacks": 0, + "canaries": 32, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 128, + "separate": false, + "rows": 4096, + "sha256": "7fc4098399ef9f684845d11b9cd5182ce7ed043c2a173b3b9ff8853aa088ea9f", + "canaries": 33, + "calls": 49 + }, + "exact": true, + "kernel_before": { + "calls": 48, + "fallbacks": 0, + "canaries": 32, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 49, + "fallbacks": 0, + "canaries": 33, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 128, + "separate": false, + "rows": 8193, + "sha256": "1f1a5fdcf377f7ec804fa548d7f3d132f90a0390521cc5d3b292ea7477725eda", + "canaries": 34, + "calls": 50 + }, + "exact": true, + "kernel_before": { + "calls": 49, + "fallbacks": 0, + "canaries": 33, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 50, + "fallbacks": 0, + "canaries": 34, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 128, + "separate": false, + "rows": 32769, + "sha256": "92804a5b7bf7bf71bfb41d4f949b3af977ad9cae968daede5f55126801d9679f", + "canaries": 34, + "calls": 51 + }, + "exact": true, + "kernel_before": { + "calls": 50, + "fallbacks": 0, + "canaries": 34, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 51, + "fallbacks": 0, + "canaries": 34, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 128, + "separate": true, + "rows": 4096, + "sha256": "34253453970278db06f67aed22650bac050dc1e6d53eced0029d67eb74b52f44", + "canaries": 35, + "calls": 52 + }, + "exact": true, + "kernel_before": { + "calls": 51, + "fallbacks": 0, + "canaries": 34, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 52, + "fallbacks": 0, + "canaries": 35, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 128, + "separate": true, + "rows": 8193, + "sha256": "b34d40e1684767f83d13ce5bbd56b361264e58cab2c413d813b09168a9b8c7a1", + "canaries": 36, + "calls": 53 + }, + "exact": true, + "kernel_before": { + "calls": 52, + "fallbacks": 0, + "canaries": 35, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 53, + "fallbacks": 0, + "canaries": 36, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 4, + "group": 128, + "separate": true, + "rows": 32769, + "sha256": "34b966da4050409b08f540bb90fd2140420b5ea1b39e4e19aa26c59aa0fbc66b", + "canaries": 36, + "calls": 54 + }, + "exact": true, + "kernel_before": { + "calls": 53, + "fallbacks": 0, + "canaries": 36, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 54, + "fallbacks": 0, + "canaries": 36, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 32, + "separate": false, + "rows": 4096, + "sha256": "edac062cba0e971069df93922bc5b7cbce80d1a5d168a55be3150a56c31c20ef", + "canaries": 37, + "calls": 55 + }, + "exact": true, + "kernel_before": { + "calls": 54, + "fallbacks": 0, + "canaries": 36, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 55, + "fallbacks": 0, + "canaries": 37, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 32, + "separate": false, + "rows": 8193, + "sha256": "49328e01d1cbbbd7a8d4330f9da8942e7e5c5d288cadc918f533205ed9bd9d11", + "canaries": 38, + "calls": 56 + }, + "exact": true, + "kernel_before": { + "calls": 55, + "fallbacks": 0, + "canaries": 37, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 56, + "fallbacks": 0, + "canaries": 38, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 32, + "separate": false, + "rows": 32769, + "sha256": "39ef9f030ba50a0a7fbf868972cda047ef0c7a05db3cdd950a742be07530674d", + "canaries": 38, + "calls": 57 + }, + "exact": true, + "kernel_before": { + "calls": 56, + "fallbacks": 0, + "canaries": 38, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 57, + "fallbacks": 0, + "canaries": 38, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 32, + "separate": true, + "rows": 4096, + "sha256": "a1b475830c5f4f00afc87f760c840731d733e74189ad3da73e19e7b9e2c26ab5", + "canaries": 39, + "calls": 58 + }, + "exact": true, + "kernel_before": { + "calls": 57, + "fallbacks": 0, + "canaries": 38, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 58, + "fallbacks": 0, + "canaries": 39, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 32, + "separate": true, + "rows": 8193, + "sha256": "f1e63fe22be3ddcd6e0ad39e535650da32e5615b7634de4428a3a25b8b2a3b68", + "canaries": 40, + "calls": 59 + }, + "exact": true, + "kernel_before": { + "calls": 58, + "fallbacks": 0, + "canaries": 39, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 59, + "fallbacks": 0, + "canaries": 40, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 32, + "separate": true, + "rows": 32769, + "sha256": "5030aa3e2fa7a8fecd071cdd9968cd06f32e749c0918104564194673765ba958", + "canaries": 40, + "calls": 60 + }, + "exact": true, + "kernel_before": { + "calls": 59, + "fallbacks": 0, + "canaries": 40, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 60, + "fallbacks": 0, + "canaries": 40, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 64, + "separate": false, + "rows": 4096, + "sha256": "fe7e5f9c8e1f359967462c90e26a1a4b6d5c069f8f86f64cb40d3ad42e7efa4a", + "canaries": 41, + "calls": 61 + }, + "exact": true, + "kernel_before": { + "calls": 60, + "fallbacks": 0, + "canaries": 40, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 61, + "fallbacks": 0, + "canaries": 41, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 64, + "separate": false, + "rows": 8193, + "sha256": "a4557ad84cdb1c8ce458a0f87b317fb43757768e0b130d48412cd7eeab229223", + "canaries": 42, + "calls": 62 + }, + "exact": true, + "kernel_before": { + "calls": 61, + "fallbacks": 0, + "canaries": 41, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 62, + "fallbacks": 0, + "canaries": 42, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 64, + "separate": false, + "rows": 32769, + "sha256": "04957d2e41c1e55a735d0e11e9e9720a71f08880e57ce9c0872e25aa240c338a", + "canaries": 42, + "calls": 63 + }, + "exact": true, + "kernel_before": { + "calls": 62, + "fallbacks": 0, + "canaries": 42, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 63, + "fallbacks": 0, + "canaries": 42, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 64, + "separate": true, + "rows": 4096, + "sha256": "697ed33f622ad0b27bf9ab2a3a0b16fadf94c932a2d34ad6b934247547939e43", + "canaries": 43, + "calls": 64 + }, + "exact": true, + "kernel_before": { + "calls": 63, + "fallbacks": 0, + "canaries": 42, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 64, + "fallbacks": 0, + "canaries": 43, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 64, + "separate": true, + "rows": 8193, + "sha256": "d0999e742e62d0181ad9936b19ddbf8e0db722c250d4321d24781833b3e1cf98", + "canaries": 44, + "calls": 65 + }, + "exact": true, + "kernel_before": { + "calls": 64, + "fallbacks": 0, + "canaries": 43, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 65, + "fallbacks": 0, + "canaries": 44, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 64, + "separate": true, + "rows": 32769, + "sha256": "3361d9b39f5de162f1cf3aeab42f070b95f3b9cb561773f5313234df0235fbca", + "canaries": 44, + "calls": 66 + }, + "exact": true, + "kernel_before": { + "calls": 65, + "fallbacks": 0, + "canaries": 44, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 66, + "fallbacks": 0, + "canaries": 44, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 128, + "separate": false, + "rows": 4096, + "sha256": "0b429863a69f86b77b5613a948ff56ef893a817af418bc606004109cdb77ee45", + "canaries": 45, + "calls": 67 + }, + "exact": true, + "kernel_before": { + "calls": 66, + "fallbacks": 0, + "canaries": 44, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 67, + "fallbacks": 0, + "canaries": 45, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 128, + "separate": false, + "rows": 8193, + "sha256": "1b0ed0f2ec8d12de2514d5296e88d5f265cf669372cda808664e2af5209035ba", + "canaries": 46, + "calls": 68 + }, + "exact": true, + "kernel_before": { + "calls": 67, + "fallbacks": 0, + "canaries": 45, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 68, + "fallbacks": 0, + "canaries": 46, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 128, + "separate": false, + "rows": 32769, + "sha256": "6776c23952ecea1417a357d69815724072fd9f5a9ead32be9ef406bf8adaf659", + "canaries": 46, + "calls": 69 + }, + "exact": true, + "kernel_before": { + "calls": 68, + "fallbacks": 0, + "canaries": 46, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 69, + "fallbacks": 0, + "canaries": 46, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 128, + "separate": true, + "rows": 4096, + "sha256": "b5a9678f8bbc238f6f23e838bc1981fe810648033e457fedd87ff5e838481fe6", + "canaries": 47, + "calls": 70 + }, + "exact": true, + "kernel_before": { + "calls": 69, + "fallbacks": 0, + "canaries": 46, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 70, + "fallbacks": 0, + "canaries": 47, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 128, + "separate": true, + "rows": 8193, + "sha256": "27062b42ed3f032ac2d4b69919003b45a4e4f167454d7b476f3362b44c95e9bc", + "canaries": 48, + "calls": 71 + }, + "exact": true, + "kernel_before": { + "calls": 70, + "fallbacks": 0, + "canaries": 47, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 71, + "fallbacks": 0, + "canaries": 48, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "synthetic_oracle", + "native": { + "case": "synthetic", + "dtype": "F16", + "bits": 8, + "group": 128, + "separate": true, + "rows": 32769, + "sha256": "88dace4dc674dcb6ac4650519ceb1974a1d23f20603d76b224a541fd4c6b0ee4", + "canaries": 48, + "calls": 72 + }, + "exact": true, + "kernel_before": { + "calls": 71, + "fallbacks": 0, + "canaries": 48, + "canary_failures": 0, + "header_failures": 0 + }, + "kernel_after": { + "calls": 72, + "fallbacks": 0, + "canaries": 48, + "canary_failures": 0, + "header_failures": 0 + } + } + ], + "final-installed-oracle": [ + { + "case": "installed_oracle", + "native": { + "case": "installed_gate_up", + "tokens": 410, + "rows": 4100, + "separate": false, + "sha256": "d61fba05a3358a85eba2bd4ecbff3b9fc9dd3ff7651d56aaec5b691b2808b3f0", + "canaries": 1, + "calls": 1, + "exact": true + }, + "exact": true, + "kernel": { + "calls": 1, + "fallbacks": 0, + "canaries": 1, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "installed_oracle", + "native": { + "case": "installed_gate_up", + "tokens": 410, + "rows": 4100, + "separate": true, + "sha256": "d61fba05a3358a85eba2bd4ecbff3b9fc9dd3ff7651d56aaec5b691b2808b3f0", + "canaries": 2, + "calls": 2, + "exact": true + }, + "exact": true, + "kernel": { + "calls": 2, + "fallbacks": 0, + "canaries": 2, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "installed_oracle", + "native": { + "case": "installed_gate_up", + "tokens": 2048, + "rows": 20480, + "separate": false, + "sha256": "c53aac85f49f4c1b6c11e3da858d2abf4e43de241bf3c0347d2590d0181e2249", + "canaries": 2, + "calls": 3, + "exact": true + }, + "exact": true, + "kernel": { + "calls": 3, + "fallbacks": 0, + "canaries": 2, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "installed_oracle", + "native": { + "case": "installed_gate_up", + "tokens": 2048, + "rows": 20480, + "separate": true, + "sha256": "c53aac85f49f4c1b6c11e3da858d2abf4e43de241bf3c0347d2590d0181e2249", + "canaries": 2, + "calls": 4, + "exact": true + }, + "exact": true, + "kernel": { + "calls": 4, + "fallbacks": 0, + "canaries": 2, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "installed_oracle", + "native": { + "case": "installed_gate_up", + "tokens": 3277, + "rows": 32770, + "separate": false, + "sha256": "10f573d0eaf5169475781c4f75eb923fa06d7f88d1684a6d5d2ce8acfdc526a4", + "canaries": 3, + "calls": 5, + "exact": true + }, + "exact": true, + "kernel": { + "calls": 5, + "fallbacks": 0, + "canaries": 3, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "installed_oracle", + "native": { + "case": "installed_gate_up", + "tokens": 3277, + "rows": 32770, + "separate": true, + "sha256": "10f573d0eaf5169475781c4f75eb923fa06d7f88d1684a6d5d2ce8acfdc526a4", + "canaries": 4, + "calls": 6, + "exact": true + }, + "exact": true, + "kernel": { + "calls": 6, + "fallbacks": 0, + "canaries": 4, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "installed_oracle", + "native": { + "case": "installed_gate_up", + "tokens": 4095, + "rows": 40950, + "separate": false, + "sha256": "738212404e537f0608d4e9c9b8d0e5ff2061587197c3391b1220975f93dd8d9f", + "canaries": 4, + "calls": 7, + "exact": true + }, + "exact": true, + "kernel": { + "calls": 7, + "fallbacks": 0, + "canaries": 4, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "installed_oracle", + "native": { + "case": "installed_gate_up", + "tokens": 4095, + "rows": 40950, + "separate": true, + "sha256": "738212404e537f0608d4e9c9b8d0e5ff2061587197c3391b1220975f93dd8d9f", + "canaries": 4, + "calls": 8, + "exact": true + }, + "exact": true, + "kernel": { + "calls": 8, + "fallbacks": 0, + "canaries": 4, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "installed_oracle", + "native": { + "case": "installed_gate_up", + "tokens": 4096, + "rows": 40960, + "separate": false, + "sha256": "e1a6630ec5cd7e523c98eb352e328560fdd733a640fc7dd69a5a96e14b462d15", + "canaries": 4, + "calls": 9, + "exact": true + }, + "exact": true, + "kernel": { + "calls": 9, + "fallbacks": 0, + "canaries": 4, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "installed_oracle", + "native": { + "case": "installed_gate_up", + "tokens": 4096, + "rows": 40960, + "separate": true, + "sha256": "e1a6630ec5cd7e523c98eb352e328560fdd733a640fc7dd69a5a96e14b462d15", + "canaries": 4, + "calls": 10, + "exact": true + }, + "exact": true, + "kernel": { + "calls": 10, + "fallbacks": 0, + "canaries": 4, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "installed_oracle", + "native": { + "case": "installed_gate_up", + "tokens": 8192, + "rows": 81920, + "separate": false, + "sha256": "05f7708e9824f26a4f82567c6c94d494bb717edbd72b3dcf39205922c0624cf0", + "canaries": 4, + "calls": 11, + "exact": true + }, + "exact": true, + "kernel": { + "calls": 11, + "fallbacks": 0, + "canaries": 4, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "installed_oracle", + "native": { + "case": "installed_gate_up", + "tokens": 8192, + "rows": 81920, + "separate": true, + "sha256": "05f7708e9824f26a4f82567c6c94d494bb717edbd72b3dcf39205922c0624cf0", + "canaries": 4, + "calls": 12, + "exact": true + }, + "exact": true, + "kernel": { + "calls": 12, + "fallbacks": 0, + "canaries": 4, + "canary_failures": 0, + "header_failures": 0 + } + } + ], + "final-model": [ + { + "case": "model_state", + "calls": 480, + "canaries": 2, + "failures": 0, + "cold_warm_exact": true + } + ], + "final-model-oracle": [ + { + "case": "model_oracle", + "chunk": 2048, + "phase": "cold", + "hidden": false, + "exact": true, + "cached": 0, + "kernel": { + "calls": 96, + "fallbacks": 0, + "canaries": 1, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "model_oracle", + "chunk": 2048, + "phase": "warm", + "hidden": false, + "exact": true, + "cached": 4097, + "kernel": { + "calls": 144, + "fallbacks": 0, + "canaries": 1, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "model_oracle", + "chunk": 4096, + "phase": "cold", + "hidden": false, + "exact": true, + "cached": 0, + "kernel": { + "calls": 192, + "fallbacks": 0, + "canaries": 2, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "model_oracle", + "chunk": 4096, + "phase": "warm", + "hidden": false, + "exact": true, + "cached": 4097, + "kernel": { + "calls": 240, + "fallbacks": 0, + "canaries": 2, + "canary_failures": 0, + "header_failures": 0 + } + } + ], + "hidden-oracle": [ + { + "case": "model_oracle", + "chunk": 2048, + "phase": "cold", + "hidden": true, + "exact": true, + "cached": 0, + "kernel": { + "calls": 96, + "fallbacks": 0, + "canaries": 1, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "model_oracle", + "chunk": 2048, + "phase": "warm", + "hidden": true, + "exact": true, + "cached": 4096, + "kernel": { + "calls": 144, + "fallbacks": 0, + "canaries": 1, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "model_oracle", + "chunk": 4096, + "phase": "cold", + "hidden": true, + "exact": true, + "cached": 0, + "kernel": { + "calls": 192, + "fallbacks": 0, + "canaries": 2, + "canary_failures": 0, + "header_failures": 0 + } + }, + { + "case": "model_oracle", + "chunk": 4096, + "phase": "warm", + "hidden": true, + "exact": true, + "cached": 4096, + "kernel": { + "calls": 240, + "fallbacks": 0, + "canaries": 2, + "canary_failures": 0, + "header_failures": 0 + } + } + ] +} \ No newline at end of file diff --git a/docs/issue112-row-map/provenance.json b/docs/issue112-row-map/provenance.json new file mode 100644 index 0000000..947af30 --- /dev/null +++ b/docs/issue112-row-map/provenance.json @@ -0,0 +1,19 @@ +{ + "baseline": "8965e77ea173c932e00f70759d0a83ac1c5072f0", + "mtplx": "9882703f3105363ddc37eca9f97aa09a1d387112", + "mlx": "0.32.2", + "artifact": "74559cdf34fbfc0b593de72d17e93f37fd4f9ea7", + "sha256": { + "metal/mtplx-moe-sorted-body.metal": "b639a135d2b9532d45c9587d94a503a093553078d8f5b5a9470c34d1bd9fca2e", + "metal/mtplx-moe-sorted-header.metal": "d3251a6cfcdbac5372c3e7e1f97720df48a91f0e456a44883c42b98cc8520e4a", + "metal/mtplx-runtime-0.32.2.metallib": "dc59d1cceb1a5c7e578232e6e41e28e2c73c9463ac6dbc3886c3ee17ffc270ed", + "/private/tmp/ds4-issue112-before-release-test": "9718805d3827bf5e998e2f574b48b7e453a45ed3de578ea9df6a450019aea0d6", + "/private/tmp/ds4-issue112-after-release-test": "9bcc33ddebe79fa026d7cb4a7c2a4dfcdba2645f66861a1e74778cf55e434912", + "/private/tmp/ds4-issue112-final-test": "f313f1ae0a43a05d359ce234977f00dba87ef8d1320034acf856592f2e2eba72" + }, + "binary_scope": { + "before-release-test": "Full-chunk timing, hidden-state and family controls. The earlier default-tail run used the same baseline production source before the hidden-only test configuration was corrected.", + "after-release-test": "Default-tail and full-chunk timings; production identical to final-test.", + "final-test": "Final kernel, model, hidden-state, off-switch and family checks; corrected hidden-only test configuration." + } +} \ No newline at end of file diff --git a/docs/issue112-row-map/release-performance.json b/docs/issue112-row-map/release-performance.json new file mode 100644 index 0000000..1a370e5 --- /dev/null +++ b/docs/issue112-row-map/release-performance.json @@ -0,0 +1,838 @@ +[ + { + "configuration": "default-tail", + "arm": "before", + "records": [ + { + "chunk": 2048, + "rep": 0, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 3.7007944999999998, + "prefill_seconds": 3.6969075010000005, + "prefill_tokens_per_second": 1107.9530658779117, + "elapsed_seconds": 3.721188 + }, + { + "chunk": 2048, + "rep": 0, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.7724733750000001, + "prefill_seconds": 1.769735542, + "prefill_tokens_per_second": 1157.23505088536, + "elapsed_seconds": 1.793335125 + }, + { + "chunk": 2048, + "rep": 1, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 2.820473209, + "prefill_seconds": 2.81689246, + "prefill_tokens_per_second": 1454.0846191906098, + "elapsed_seconds": 2.841268834 + }, + { + "chunk": 2048, + "rep": 1, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.838782375, + "prefill_seconds": 1.836070168, + "prefill_tokens_per_second": 1115.4257803942492, + "elapsed_seconds": 1.8597940419999999 + }, + { + "chunk": 2048, + "rep": 2, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 2.959423792, + "prefill_seconds": 2.9556270000000002, + "prefill_tokens_per_second": 1385.831162051233, + "elapsed_seconds": 2.98031925 + }, + { + "chunk": 2048, + "rep": 2, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.922527375, + "prefill_seconds": 1.919643709, + "prefill_tokens_per_second": 1066.8646428492007, + "elapsed_seconds": 1.9441567499999999 + }, + { + "chunk": 4096, + "rep": 0, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 3.626180458, + "prefill_seconds": 3.6201352510000007, + "prefill_tokens_per_second": 1131.4494393181994, + "elapsed_seconds": 3.64758525 + }, + { + "chunk": 4096, + "rep": 0, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.994229042, + "prefill_seconds": 1.9914031639999998, + "prefill_tokens_per_second": 1028.4205815392588, + "elapsed_seconds": 2.016047875 + }, + { + "chunk": 4096, + "rep": 1, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 3.6903119589999998, + "prefill_seconds": 3.6843170420000004, + "prefill_tokens_per_second": 1111.7392866322168, + "elapsed_seconds": 3.711886 + }, + { + "chunk": 4096, + "rep": 1, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 2.011648875, + "prefill_seconds": 2.0087712079999998, + "prefill_tokens_per_second": 1019.5287506331085, + "elapsed_seconds": 2.033881333 + }, + { + "chunk": 4096, + "rep": 2, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 3.752376958, + "prefill_seconds": 3.7459722089999996, + "prefill_tokens_per_second": 1093.4411072669013, + "elapsed_seconds": 3.774499291 + }, + { + "chunk": 4096, + "rep": 2, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 2.020803542, + "prefill_seconds": 2.017895623, + "prefill_tokens_per_second": 1014.918698795354, + "elapsed_seconds": 2.043202292 + } + ], + "summary": [ + { + "chunk": 2048, + "phase": "cold", + "ttft_seconds": { + "mean": 3.1602305003333333, + "median": 2.959423792, + "sample_stddev": 0.47326936772912714 + }, + "prefill_tokens_per_second": { + "mean": 1315.9562823732515, + "median": 1385.831162051233, + "sample_stddev": 183.340222420435 + } + }, + { + "chunk": 2048, + "phase": "warm", + "ttft_seconds": { + "mean": 1.844594375, + "median": 1.838782375, + "sample_stddev": 0.07519564639658331 + }, + "prefill_tokens_per_second": { + "mean": 1113.1751580429366, + "median": 1115.4257803942492, + "sample_stddev": 45.227222310038556 + } + }, + { + "chunk": 4096, + "phase": "cold", + "ttft_seconds": { + "mean": 3.689623125, + "median": 3.6903119589999998, + "sample_stddev": 0.06310106989799923 + }, + "prefill_tokens_per_second": { + "mean": 1112.2099444057726, + "median": 1111.7392866322168, + "sample_stddev": 19.00853664502584 + } + }, + { + "chunk": 4096, + "phase": "warm", + "ttft_seconds": { + "mean": 2.0088938196666666, + "median": 2.011648875, + "sample_stddev": 0.013499768886162316 + }, + "prefill_tokens_per_second": { + "mean": 1020.9560103225738, + "median": 1019.5287506331085, + "sample_stddev": 6.863163415905101 + } + } + ], + "resources": { + "event": "test_resource_summary", + "elapsed_ms": 41097, + "peak": { + "cpu_time_ns": 19599062416, + "resident_bytes": 25489604608, + "physical_bytes": 84724073856, + "peak_physical_bytes": 84724139512, + "disk_read_bytes": 64097386496, + "disk_write_bytes": 442368 + }, + "error": null + } + }, + { + "configuration": "default-tail", + "arm": "after", + "records": [ + { + "chunk": 2048, + "rep": 0, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 3.699041667, + "prefill_seconds": 3.6953074989999997, + "prefill_tokens_per_second": 1108.4327897227588, + "elapsed_seconds": 3.719328292 + }, + { + "chunk": 2048, + "rep": 0, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.776398, + "prefill_seconds": 1.7737045, + "prefill_tokens_per_second": 1154.6455455235075, + "elapsed_seconds": 1.797202167 + }, + { + "chunk": 2048, + "rep": 1, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 2.80434375, + "prefill_seconds": 2.8008109150000005, + "prefill_tokens_per_second": 1462.4336038050606, + "elapsed_seconds": 2.825135334 + }, + { + "chunk": 2048, + "rep": 1, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.900156542, + "prefill_seconds": 1.897415875, + "prefill_tokens_per_second": 1079.3627411808177, + "elapsed_seconds": 1.9216478750000001 + }, + { + "chunk": 2048, + "rep": 2, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 2.952652333, + "prefill_seconds": 2.948979292, + "prefill_tokens_per_second": 1388.9551585226932, + "elapsed_seconds": 2.973752041 + }, + { + "chunk": 2048, + "rep": 2, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.947212708, + "prefill_seconds": 1.944330169, + "prefill_tokens_per_second": 1053.3190466582735, + "elapsed_seconds": 1.9688718330000001 + }, + { + "chunk": 4096, + "rep": 0, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 3.637618958, + "prefill_seconds": 3.631528458, + "prefill_tokens_per_second": 1127.8997390139687, + "elapsed_seconds": 3.659774833 + }, + { + "chunk": 4096, + "rep": 0, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.9611875410000001, + "prefill_seconds": 1.958409373, + "prefill_tokens_per_second": 1045.7466289914453, + "elapsed_seconds": 1.982932208 + }, + { + "chunk": 4096, + "rep": 1, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 3.6904271250000003, + "prefill_seconds": 3.684310291, + "prefill_tokens_per_second": 1111.7413237440048, + "elapsed_seconds": 3.71194925 + }, + { + "chunk": 4096, + "rep": 1, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.988992875, + "prefill_seconds": 1.98611425, + "prefill_tokens_per_second": 1031.159209496634, + "elapsed_seconds": 2.010877 + }, + { + "chunk": 4096, + "rep": 2, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 3.684088083, + "prefill_seconds": 3.6781829150000003, + "prefill_tokens_per_second": 1113.5933406944227, + "elapsed_seconds": 3.705752166 + }, + { + "chunk": 4096, + "rep": 2, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.998740333, + "prefill_seconds": 1.9958163330000003, + "prefill_tokens_per_second": 1026.1465276825147, + "elapsed_seconds": 2.021001667 + } + ], + "summary": [ + { + "chunk": 2048, + "phase": "cold", + "ttft_seconds": { + "mean": 3.1520125833333332, + "median": 2.952652333, + "sample_stddev": 0.4795096169325091 + }, + "prefill_tokens_per_second": { + "mean": 1319.940517350171, + "median": 1388.9551585226932, + "sample_stddev": 186.81918963228082 + } + }, + { + "chunk": 2048, + "phase": "warm", + "ttft_seconds": { + "mean": 1.8745890833333332, + "median": 1.900156542, + "sample_stddev": 0.0882308751191163 + }, + "prefill_tokens_per_second": { + "mean": 1095.775777787533, + "median": 1079.3627411808177, + "sample_stddev": 52.619441949355554 + } + }, + { + "chunk": 4096, + "phase": "cold", + "ttft_seconds": { + "mean": 3.6707113886666667, + "median": 3.684088083, + "sample_stddev": 0.02883361907462447 + }, + "prefill_tokens_per_second": { + "mean": 1117.7448011507988, + "median": 1113.5933406944227, + "sample_stddev": 8.843051732845977 + } + }, + { + "chunk": 4096, + "phase": "warm", + "ttft_seconds": { + "mean": 1.9829735830000002, + "median": 1.988992875, + "sample_stddev": 0.019486583946006573 + }, + "prefill_tokens_per_second": { + "mean": 1034.3507887235314, + "median": 1031.159209496634, + "sample_stddev": 10.18236840333609 + } + } + ], + "resources": { + "event": "test_resource_summary", + "elapsed_ms": 40871, + "peak": { + "cpu_time_ns": 19458778041, + "resident_bytes": 25328418816, + "physical_bytes": 84668646808, + "peak_physical_bytes": 84668761376, + "disk_read_bytes": 69973549056, + "disk_write_bytes": 18446744073709289472 + }, + "error": null + } + }, + { + "configuration": "full-chunks", + "arm": "before", + "records": [ + { + "chunk": 2048, + "rep": 0, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 3.182152, + "prefill_seconds": 3.17999279, + "prefill_tokens_per_second": 1288.0532348628376, + "elapsed_seconds": 3.202144875 + }, + { + "chunk": 2048, + "rep": 0, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.219195625, + "prefill_seconds": 1.21829175, + "prefill_tokens_per_second": 1681.042328325707, + "elapsed_seconds": 1.240087208 + }, + { + "chunk": 2048, + "rep": 1, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 2.317122125, + "prefill_seconds": 2.3159108330000002, + "prefill_tokens_per_second": 1768.6345871503593, + "elapsed_seconds": 2.338011208 + }, + { + "chunk": 2048, + "rep": 1, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.26216725, + "prefill_seconds": 1.261251084, + "prefill_tokens_per_second": 1623.7845310743853, + "elapsed_seconds": 1.283571459 + }, + { + "chunk": 2048, + "rep": 2, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 2.411353459, + "prefill_seconds": 2.410105791, + "prefill_tokens_per_second": 1699.510459373026, + "elapsed_seconds": 2.431755125 + }, + { + "chunk": 2048, + "rep": 2, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.34331275, + "prefill_seconds": 1.34238875, + "prefill_tokens_per_second": 1525.6385305672443, + "elapsed_seconds": 1.364779 + }, + { + "chunk": 4096, + "rep": 0, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 3.2133175, + "prefill_seconds": 3.212275166, + "prefill_tokens_per_second": 1275.1086965879188, + "elapsed_seconds": 3.233724875 + }, + { + "chunk": 4096, + "rep": 0, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.7273878329999999, + "prefill_seconds": 1.7264041659999998, + "prefill_tokens_per_second": 1186.2807332915115, + "elapsed_seconds": 1.7481919160000001 + }, + { + "chunk": 4096, + "rep": 1, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 2.980801042, + "prefill_seconds": 2.979894292, + "prefill_tokens_per_second": 1374.5454028340412, + "elapsed_seconds": 3.001205167 + }, + { + "chunk": 4096, + "rep": 1, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.7668409999999999, + "prefill_seconds": 1.765948334, + "prefill_tokens_per_second": 1159.7168278197203, + "elapsed_seconds": 1.787861709 + }, + { + "chunk": 4096, + "rep": 2, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 3.100441792, + "prefill_seconds": 3.0994622499999998, + "prefill_tokens_per_second": 1321.5195635952657, + "elapsed_seconds": 3.121023875 + }, + { + "chunk": 4096, + "rep": 2, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.838995291, + "prefill_seconds": 1.838062583, + "prefill_tokens_per_second": 1114.216686059378, + "elapsed_seconds": 1.860065208 + } + ], + "summary": [ + { + "chunk": 2048, + "phase": "cold", + "ttft_seconds": { + "mean": 2.6368758613333334, + "median": 2.411353459, + "sample_stddev": 0.4745676312458291 + }, + "prefill_tokens_per_second": { + "mean": 1585.3994271287409, + "median": 1699.510459373026, + "sample_stddev": 259.81840735698063 + } + }, + { + "chunk": 2048, + "phase": "warm", + "ttft_seconds": { + "mean": 1.274891875, + "median": 1.26216725, + "sample_stddev": 0.06302937601316841 + }, + "prefill_tokens_per_second": { + "mean": 1610.1551299891123, + "median": 1623.7845310743853, + "sample_stddev": 78.59329182503896 + } + }, + { + "chunk": 4096, + "phase": "cold", + "ttft_seconds": { + "mean": 3.098186778, + "median": 3.100441792, + "sample_stddev": 0.11627463019215153 + }, + "prefill_tokens_per_second": { + "mean": 1323.7245543390752, + "median": 1321.5195635952657, + "sample_stddev": 49.755011058230345 + } + }, + { + "chunk": 4096, + "phase": "warm", + "ttft_seconds": { + "mean": 1.7777413746666666, + "median": 1.7668409999999999, + "sample_stddev": 0.05659655286508827 + }, + "prefill_tokens_per_second": { + "mean": 1153.4047490568698, + "median": 1159.7168278197203, + "sample_stddev": 36.444320265304924 + } + } + ], + "resources": { + "event": "test_resource_summary", + "elapsed_ms": 35856, + "peak": { + "cpu_time_ns": 21540742125, + "resident_bytes": 25113673728, + "physical_bytes": 88578784936, + "peak_physical_bytes": 88578866928, + "disk_read_bytes": 69525413888, + "disk_write_bytes": 524288 + }, + "error": null + } + }, + { + "configuration": "full-chunks", + "arm": "after", + "records": [ + { + "chunk": 2048, + "rep": 0, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 3.126132542, + "prefill_seconds": 3.1225067920000003, + "prefill_tokens_per_second": 1311.766562203846, + "elapsed_seconds": 3.147092209 + }, + { + "chunk": 2048, + "rep": 0, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.262224125, + "prefill_seconds": 1.258582084, + "prefill_tokens_per_second": 1627.2279941337542, + "elapsed_seconds": 1.282883709 + }, + { + "chunk": 2048, + "rep": 1, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 2.304937333, + "prefill_seconds": 2.303636208, + "prefill_tokens_per_second": 1778.058525810426, + "elapsed_seconds": 2.325319833 + }, + { + "chunk": 2048, + "rep": 1, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.333947917, + "prefill_seconds": 1.3330325, + "prefill_tokens_per_second": 1536.346638210246, + "elapsed_seconds": 1.354474625 + }, + { + "chunk": 2048, + "rep": 2, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 2.504060958, + "prefill_seconds": 2.502749457, + "prefill_tokens_per_second": 1636.6000953646394, + "elapsed_seconds": 2.524487958 + }, + { + "chunk": 2048, + "rep": 2, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.363442375, + "prefill_seconds": 1.362460209, + "prefill_tokens_per_second": 1503.1631650388993, + "elapsed_seconds": 1.3840412500000001 + }, + { + "chunk": 4096, + "rep": 0, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 2.955218083, + "prefill_seconds": 2.9541866239999997, + "prefill_tokens_per_second": 1386.50685326507, + "elapsed_seconds": 2.9757388750000002 + }, + { + "chunk": 4096, + "rep": 0, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.606924, + "prefill_seconds": 1.6059842079999997, + "prefill_tokens_per_second": 1275.2304722538095, + "elapsed_seconds": 1.62792175 + }, + { + "chunk": 4096, + "rep": 1, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 3.209116167, + "prefill_seconds": 3.2081535000000003, + "prefill_tokens_per_second": 1276.7468888256126, + "elapsed_seconds": 3.230131833 + }, + { + "chunk": 4096, + "rep": 1, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.767990417, + "prefill_seconds": 1.767019791, + "prefill_tokens_per_second": 1159.0136174088839, + "elapsed_seconds": 1.789304875 + }, + { + "chunk": 4096, + "rep": 2, + "phase": "cold", + "prompt": 4096, + "cached": 0, + "ttft_seconds": 2.998665042, + "prefill_seconds": 2.997745792, + "prefill_tokens_per_second": 1366.3600198959098, + "elapsed_seconds": 3.019893375 + }, + { + "chunk": 4096, + "rep": 2, + "phase": "warm", + "prompt": 6145, + "cached": 4097, + "ttft_seconds": 1.633976833, + "prefill_seconds": 1.633039209, + "prefill_tokens_per_second": 1254.1033850951462, + "elapsed_seconds": 1.656772416 + } + ], + "summary": [ + { + "chunk": 2048, + "phase": "cold", + "ttft_seconds": { + "mean": 2.645043611, + "median": 2.504060958, + "sample_stddev": 0.4283660515917751 + }, + "prefill_tokens_per_second": { + "mean": 1575.475061126304, + "median": 1636.6000953646394, + "sample_stddev": 239.08001001547228 + } + }, + { + "chunk": 2048, + "phase": "warm", + "ttft_seconds": { + "mean": 1.3198714723333334, + "median": 1.333947917, + "sample_stddev": 0.052056635063226324 + }, + "prefill_tokens_per_second": { + "mean": 1555.5792657942998, + "median": 1536.346638210246, + "sample_stddev": 64.22959541694213 + } + }, + { + "chunk": 4096, + "phase": "cold", + "ttft_seconds": { + "mean": 3.054333097333333, + "median": 2.998665042, + "sample_stddev": 0.1357949135761868 + }, + "prefill_tokens_per_second": { + "mean": 1343.2045873288641, + "median": 1366.3600198959098, + "sample_stddev": 58.42895678910406 + } + }, + { + "chunk": 4096, + "phase": "warm", + "ttft_seconds": { + "mean": 1.6696304166666667, + "median": 1.633976833, + "sample_stddev": 0.0862495286509525 + }, + "prefill_tokens_per_second": { + "mean": 1229.4491582526132, + "median": 1254.1033850951462, + "sample_stddev": 61.90688583198103 + } + } + ], + "resources": { + "event": "test_resource_summary", + "elapsed_ms": 34614, + "peak": { + "cpu_time_ns": 20995139625, + "resident_bytes": 25576030208, + "physical_bytes": 87952375368, + "peak_physical_bytes": 87952457288, + "disk_read_bytes": 64869085184, + "disk_write_bytes": 442368 + }, + "error": null + } + } +] \ No newline at end of file diff --git a/docs/issue112-row-map/resource-summaries.json b/docs/issue112-row-map/resource-summaries.json new file mode 100644 index 0000000..20caffe --- /dev/null +++ b/docs/issue112-row-map/resource-summaries.json @@ -0,0 +1,184 @@ +{ + "final-variants": { + "event": "test_resource_summary", + "elapsed_ms": 440, + "peak": { + "cpu_time_ns": 245994500, + "resident_bytes": 281100288, + "physical_bytes": 399917944, + "peak_physical_bytes": 419464080, + "disk_read_bytes": 0, + "disk_write_bytes": 0 + }, + "error": null + }, + "final-failures": { + "event": "test_resource_summary", + "elapsed_ms": 219, + "peak": { + "cpu_time_ns": 53213250, + "resident_bytes": 70057984, + "physical_bytes": 177390336, + "peak_physical_bytes": 177636096, + "disk_read_bytes": 0, + "disk_write_bytes": 0 + }, + "error": null + }, + "final-installed": { + "event": "test_resource_summary", + "elapsed_ms": 760, + "peak": { + "cpu_time_ns": 504222750, + "resident_bytes": 2076639232, + "physical_bytes": 4867475808, + "peak_physical_bytes": 5012703704, + "disk_read_bytes": 0, + "disk_write_bytes": 0 + }, + "error": null + }, + "final-variants-oracle": { + "event": "test_resource_summary", + "elapsed_ms": 762, + "peak": { + "cpu_time_ns": 562100250, + "resident_bytes": 142884864, + "physical_bytes": 359269216, + "peak_physical_bytes": 387105656, + "disk_read_bytes": 0, + "disk_write_bytes": 0 + }, + "error": null + }, + "final-installed-oracle": { + "event": "test_resource_summary", + "elapsed_ms": 1200, + "peak": { + "cpu_time_ns": 959967166, + "resident_bytes": 2091220992, + "physical_bytes": 3261778056, + "peak_physical_bytes": 4137257216, + "disk_read_bytes": 421888, + "disk_write_bytes": 0 + }, + "error": null + }, + "after-hidden": { + "event": "test_resource_summary", + "elapsed_ms": 19796, + "peak": { + "cpu_time_ns": 16081049958, + "resident_bytes": 25542393856, + "physical_bytes": 87610048312, + "peak_physical_bytes": 87611588312, + "disk_read_bytes": 65141735424, + "disk_write_bytes": 147456 + }, + "error": null + }, + "final-model": { + "event": "test_resource_summary", + "elapsed_ms": 29057, + "peak": { + "cpu_time_ns": 23619215916, + "resident_bytes": 25820266496, + "physical_bytes": 101435424688, + "peak_physical_bytes": 101440126416, + "disk_read_bytes": 71619133440, + "disk_write_bytes": 208896 + }, + "error": null + }, + "off": { + "event": "test_resource_summary", + "elapsed_ms": 18110, + "peak": { + "cpu_time_ns": 14743490958, + "resident_bytes": 25949437952, + "physical_bytes": 88457051624, + "peak_physical_bytes": 88460278864, + "disk_read_bytes": 66400653312, + "disk_write_bytes": 147456 + }, + "error": null + }, + "final-model-oracle": { + "event": "test_resource_summary", + "elapsed_ms": 19987, + "peak": { + "cpu_time_ns": 17635902708, + "resident_bytes": 25024905216, + "physical_bytes": 84086635888, + "peak_physical_bytes": 84086652296, + "disk_read_bytes": 103826788352, + "disk_write_bytes": 311296 + }, + "error": null + }, + "hidden-oracle": { + "event": "test_resource_summary", + "elapsed_ms": 19800, + "peak": { + "cpu_time_ns": 17457184041, + "resident_bytes": 25029591040, + "physical_bytes": 84092452352, + "peak_physical_bytes": 84092468760, + "disk_read_bytes": 103815700480, + "disk_write_bytes": 18446744073709027328 + }, + "error": null + }, + "deepseek": { + "event": "test_resource_summary", + "elapsed_ms": 9561, + "peak": { + "cpu_time_ns": 2757894458, + "resident_bytes": 130564096, + "physical_bytes": 307839816, + "peak_physical_bytes": 319898440, + "disk_read_bytes": 86739410944, + "disk_write_bytes": 0 + }, + "error": null + }, + "glm": { + "event": "test_resource_summary", + "elapsed_ms": 11928, + "peak": { + "cpu_time_ns": 3587549375, + "resident_bytes": 905478144, + "physical_bytes": 1335444992, + "peak_physical_bytes": 1488717432, + "disk_read_bytes": 96510627840, + "disk_write_bytes": 0 + }, + "error": null + }, + "before-deepseek": { + "event": "test_resource_summary", + "elapsed_ms": 7984, + "peak": { + "cpu_time_ns": 2510786166, + "resident_bytes": 130416640, + "physical_bytes": 301171504, + "peak_physical_bytes": 319750984, + "disk_read_bytes": 69381001216, + "disk_write_bytes": 0 + }, + "error": null + }, + "before-glm": { + "event": "test_resource_summary", + "elapsed_ms": 9244, + "peak": { + "cpu_time_ns": 2799064958, + "resident_bytes": 905216000, + "physical_bytes": 1335182800, + "peak_physical_bytes": 1488471648, + "disk_read_bytes": 68293218304, + "disk_write_bytes": 0 + }, + "error": null + } +} \ No newline at end of file diff --git a/docs/issue112-row-map/state-comparisons.json b/docs/issue112-row-map/state-comparisons.json new file mode 100644 index 0000000..3749b6d --- /dev/null +++ b/docs/issue112-row-map/state-comparisons.json @@ -0,0 +1,218 @@ +[ + { + "configuration": "default", + "case": "2048-0-cold", + "before": "a2703e87cc7c4ad2875ce10acfbf1f3d9f52f9a2e60ebb0deca96eabdbe1df8a", + "after": "a2703e87cc7c4ad2875ce10acfbf1f3d9f52f9a2e60ebb0deca96eabdbe1df8a", + "exact": true + }, + { + "configuration": "default", + "case": "2048-0-warm", + "before": "01419a6cc7e7df73215f36a5f0f69516cb19ed537e54d379ffa105f0b258b3b4", + "after": "01419a6cc7e7df73215f36a5f0f69516cb19ed537e54d379ffa105f0b258b3b4", + "exact": true + }, + { + "configuration": "default", + "case": "2048-1-cold", + "before": "a2703e87cc7c4ad2875ce10acfbf1f3d9f52f9a2e60ebb0deca96eabdbe1df8a", + "after": "a2703e87cc7c4ad2875ce10acfbf1f3d9f52f9a2e60ebb0deca96eabdbe1df8a", + "exact": true + }, + { + "configuration": "default", + "case": "2048-1-warm", + "before": "01419a6cc7e7df73215f36a5f0f69516cb19ed537e54d379ffa105f0b258b3b4", + "after": "01419a6cc7e7df73215f36a5f0f69516cb19ed537e54d379ffa105f0b258b3b4", + "exact": true + }, + { + "configuration": "default", + "case": "2048-2-cold", + "before": "a2703e87cc7c4ad2875ce10acfbf1f3d9f52f9a2e60ebb0deca96eabdbe1df8a", + "after": "a2703e87cc7c4ad2875ce10acfbf1f3d9f52f9a2e60ebb0deca96eabdbe1df8a", + "exact": true + }, + { + "configuration": "default", + "case": "2048-2-warm", + "before": "01419a6cc7e7df73215f36a5f0f69516cb19ed537e54d379ffa105f0b258b3b4", + "after": "01419a6cc7e7df73215f36a5f0f69516cb19ed537e54d379ffa105f0b258b3b4", + "exact": true + }, + { + "configuration": "default", + "case": "4096-0-cold", + "before": "40261bef7a25aea30203d13bf91d34dc27c6ecfb2be56c777a1ed7e2defbb48f", + "after": "40261bef7a25aea30203d13bf91d34dc27c6ecfb2be56c777a1ed7e2defbb48f", + "exact": true + }, + { + "configuration": "default", + "case": "4096-0-warm", + "before": "b4bf12137a534f71947b81f413a956e14d4bb42d493907f82ce5fb1be8fca3e8", + "after": "b4bf12137a534f71947b81f413a956e14d4bb42d493907f82ce5fb1be8fca3e8", + "exact": true + }, + { + "configuration": "default", + "case": "4096-1-cold", + "before": "40261bef7a25aea30203d13bf91d34dc27c6ecfb2be56c777a1ed7e2defbb48f", + "after": "40261bef7a25aea30203d13bf91d34dc27c6ecfb2be56c777a1ed7e2defbb48f", + "exact": true + }, + { + "configuration": "default", + "case": "4096-1-warm", + "before": "b4bf12137a534f71947b81f413a956e14d4bb42d493907f82ce5fb1be8fca3e8", + "after": "b4bf12137a534f71947b81f413a956e14d4bb42d493907f82ce5fb1be8fca3e8", + "exact": true + }, + { + "configuration": "default", + "case": "4096-2-cold", + "before": "40261bef7a25aea30203d13bf91d34dc27c6ecfb2be56c777a1ed7e2defbb48f", + "after": "40261bef7a25aea30203d13bf91d34dc27c6ecfb2be56c777a1ed7e2defbb48f", + "exact": true + }, + { + "configuration": "default", + "case": "4096-2-warm", + "before": "b4bf12137a534f71947b81f413a956e14d4bb42d493907f82ce5fb1be8fca3e8", + "after": "b4bf12137a534f71947b81f413a956e14d4bb42d493907f82ce5fb1be8fca3e8", + "exact": true + }, + { + "configuration": "full", + "case": "2048-0-cold", + "before": "8458c6beaa14c37b7adab9708f4d74d2d491726d5b80241398ecbdc37081b352", + "after": "8458c6beaa14c37b7adab9708f4d74d2d491726d5b80241398ecbdc37081b352", + "exact": true + }, + { + "configuration": "full", + "case": "2048-0-warm", + "before": "84b32d2e43daf4b57f6e6c58f5a9625227ce996e89e7f3a6f029df720892a891", + "after": "84b32d2e43daf4b57f6e6c58f5a9625227ce996e89e7f3a6f029df720892a891", + "exact": true + }, + { + "configuration": "full", + "case": "2048-1-cold", + "before": "8458c6beaa14c37b7adab9708f4d74d2d491726d5b80241398ecbdc37081b352", + "after": "8458c6beaa14c37b7adab9708f4d74d2d491726d5b80241398ecbdc37081b352", + "exact": true + }, + { + "configuration": "full", + "case": "2048-1-warm", + "before": "84b32d2e43daf4b57f6e6c58f5a9625227ce996e89e7f3a6f029df720892a891", + "after": "84b32d2e43daf4b57f6e6c58f5a9625227ce996e89e7f3a6f029df720892a891", + "exact": true + }, + { + "configuration": "full", + "case": "2048-2-cold", + "before": "8458c6beaa14c37b7adab9708f4d74d2d491726d5b80241398ecbdc37081b352", + "after": "8458c6beaa14c37b7adab9708f4d74d2d491726d5b80241398ecbdc37081b352", + "exact": true + }, + { + "configuration": "full", + "case": "2048-2-warm", + "before": "84b32d2e43daf4b57f6e6c58f5a9625227ce996e89e7f3a6f029df720892a891", + "after": "84b32d2e43daf4b57f6e6c58f5a9625227ce996e89e7f3a6f029df720892a891", + "exact": true + }, + { + "configuration": "full", + "case": "4096-0-cold", + "before": "466f9143f42f0520e3d51cde389e6cfca65a2396b1fcc9356bad3cf7fb3f3a8b", + "after": "466f9143f42f0520e3d51cde389e6cfca65a2396b1fcc9356bad3cf7fb3f3a8b", + "exact": true + }, + { + "configuration": "full", + "case": "4096-0-warm", + "before": "2e0e79e826860dc131b0ac7b458981658a3b4af838e2b6b2953bd542f0fd609f", + "after": "2e0e79e826860dc131b0ac7b458981658a3b4af838e2b6b2953bd542f0fd609f", + "exact": true + }, + { + "configuration": "full", + "case": "4096-1-cold", + "before": "466f9143f42f0520e3d51cde389e6cfca65a2396b1fcc9356bad3cf7fb3f3a8b", + "after": "466f9143f42f0520e3d51cde389e6cfca65a2396b1fcc9356bad3cf7fb3f3a8b", + "exact": true + }, + { + "configuration": "full", + "case": "4096-1-warm", + "before": "2e0e79e826860dc131b0ac7b458981658a3b4af838e2b6b2953bd542f0fd609f", + "after": "2e0e79e826860dc131b0ac7b458981658a3b4af838e2b6b2953bd542f0fd609f", + "exact": true + }, + { + "configuration": "full", + "case": "4096-2-cold", + "before": "466f9143f42f0520e3d51cde389e6cfca65a2396b1fcc9356bad3cf7fb3f3a8b", + "after": "466f9143f42f0520e3d51cde389e6cfca65a2396b1fcc9356bad3cf7fb3f3a8b", + "exact": true + }, + { + "configuration": "full", + "case": "4096-2-warm", + "before": "2e0e79e826860dc131b0ac7b458981658a3b4af838e2b6b2953bd542f0fd609f", + "after": "2e0e79e826860dc131b0ac7b458981658a3b4af838e2b6b2953bd542f0fd609f", + "exact": true + }, + { + "configuration": "hidden", + "case": "2048-cold", + "before": "9616a339d8ec57e48fd4342d244b0fbeb86148722f1e6733f5ff4ea5c4862bf5", + "after": "9616a339d8ec57e48fd4342d244b0fbeb86148722f1e6733f5ff4ea5c4862bf5", + "exact": true + }, + { + "configuration": "hidden", + "case": "2048-warm", + "before": "fe0116cf8aebc195d3fb01970cb8be133d17750bf0284db1825747e6e21f0e0b", + "after": "fe0116cf8aebc195d3fb01970cb8be133d17750bf0284db1825747e6e21f0e0b", + "exact": true + }, + { + "configuration": "hidden", + "case": "4096-cold", + "before": "40d9efadffeeec8cc6e42d31241276a1fb727bac9fba3e0621343057e7588403", + "after": "40d9efadffeeec8cc6e42d31241276a1fb727bac9fba3e0621343057e7588403", + "exact": true + }, + { + "configuration": "hidden", + "case": "4096-warm", + "before": "2a40fec32283b8a2434181655260daa14fe9b3731b37e6a82c842a75df14d586", + "after": "2a40fec32283b8a2434181655260daa14fe9b3731b37e6a82c842a75df14d586", + "exact": true + }, + { + "configuration": "off", + "case": "2048-0-cold", + "exact": true + }, + { + "configuration": "off", + "case": "4096-0-warm", + "exact": true + }, + { + "configuration": "off", + "case": "4096-0-cold", + "exact": true + }, + { + "configuration": "off", + "case": "2048-0-warm", + "exact": true + } +] \ No newline at end of file diff --git a/docs/issue112-row-map/tests.log b/docs/issue112-row-map/tests.log new file mode 100644 index 0000000..d070a21 --- /dev/null +++ b/docs/issue112-row-map/tests.log @@ -0,0 +1,589 @@ + Compiling ds4-server v0.1.0 (/Users/gb/Projects/DS4Server) + Finished `test` profile [unoptimized + debuginfo] target(s) in 6.12s +warning: the following packages contain code that will be rejected by a future version of Rust: block v0.1.6 +note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 1` + Running unittests src/main.rs (target/debug/deps/ds4_server-5679c54d8848b708) + +running 546 tests +test agent::tests::anchored_edits_require_unique_head_and_tail ... ok +test agent::tests::ai_risk_response_requires_structured_risk_and_reason ... ok +test a2ui::tests::streaming_parser_only_accepts_complete_a2ui_jsonl_lines ... ok +test agent::tests::ai_shell_risk_assessment_receives_the_dev_brain_root ... ok +test a2ui::tests::embedded_catalog_and_validator_cover_the_same_components ... ok +test agent::tests::dev_brain_paths_are_trusted_by_shell_risk_assessment ... ok +test a2ui::tests::basic_formatters_follow_catalog_examples ... ok +test a2ui::tests::catalog_validation_rejects_invalid_variants_and_function_arguments ... ok +test a2ui::tests::catalog_accepts_pie_donut_and_heatmap_charts ... ok +test a2ui::tests::dismissal_boundaries_replay_history_and_a_fresh_active_epoch ... ok +test a2ui::tests::lifecycle_updates_incrementally_and_json_pointer_upserts ... ok +test a2ui::tests::latest_created_surface_is_the_active_surface ... ok +test agent::tests::present_svg_parsers_recover_exact_source_for_both_model_transports ... ok +test a2ui::tests::catalog_validation_and_actions_use_current_local_data ... ok +test agent::tests::ralph_loop_stops_on_cap_blocker_failure_and_cancellation ... ok +test a2ui::tests::all_basics_compose_into_one_surface ... ok +test a2ui::tests::v1_action_and_function_round_trips_follow_current_schema ... ok +test agent::tests::ralph_report_semantics_and_handoff_bound_are_enforced ... ok +test agent::tests::risky_shell_commands_require_one_time_approval ... ok +test agent::tests::generated_schemas_match_the_executable_tool_contracts ... ok +test agent::tests::model_adapters_preserve_primitives_and_report_recoverable_syntax_errors ... ok +test agent::tests::scripted_ralph_backend_gets_fresh_prompts_and_only_validated_handoffs ... ok +test agent::tests::repeated_call_advisories_use_canonical_arguments_and_reset_per_user_turn ... ok +test agent::tests::project_boundary_rejects_parent_paths ... ok +test a2ui::export::tests::static_svg_renderer_covers_the_complete_catalog ... ok +test agent::tests::ralph_report_schemas_are_child_only_and_parse_for_both_models ... ok +test agent::tests::stored_tool_cards_restore_ai_approval_reasons_by_call ... ok +test agent::tests::tool_output_keeps_terminal_lines_but_parameter_summaries_do_not ... ok +test agent::tests::present_svg_executes_without_side_effects_and_maps_only_completed_cards ... ok +test agent::web::tests::browser_helpers_preserve_ds4_wire_values ... ok +test agent::web::tests::headless_browser_extracts_a_local_page ... ignored, requires an installed Chrome browser +test agent::tests::prompts_and_parsers_expose_the_reference_tool_set ... ok +test agent::tests::validation_is_precise_and_prevents_side_effects_until_corrected ... ok +test app::generation::tests::attached_image_marker_is_model_only ... ok +test agent::tests::present_svg_validation_enforces_the_static_vector_boundary ... ok +test agent::tests::glob_confinement_skips_symlinks_and_honors_cancellation ... ok +test agent::tests::successful_structured_file_tools_report_project_paths ... ok +test agent::tests::glob_finds_all_regular_file_names_deterministically_without_reading_them ... ok +test agent::tests::standard_agent_skills_are_discovered_prompted_and_read_only ... ok +test agent::tests::shell_commands_skip_user_startup_files ... ok +test app::generation::tests::plain_chat_uses_the_same_unmodified_prompt_in_ui_and_headless ... ok +test app::generation::tests::queued_guidance_is_one_reference_style_user_turn ... ok +test app::generation::tests::title_context_starts_at_the_first_user_and_ignores_system_rows ... ok +test app::generation::tests::turn_summary_accumulates_model_continuations ... ok +test agent::tests::shell_environment_is_loaded_once_from_login_and_interactive_startup_files ... ok +test agent::tests::standard_file_tools_can_maintain_only_managed_dev_brain_pages ... ok +test app::git::tests::configured_git_diff_options_change_the_rendered_patch ... ok +test app::git::tests::unified_diff_parser_aligns_replacements_for_split_view ... ok +test agent::tests::ralph_round_contexts_are_unique_and_child_jobs_are_cleaned_up ... ok +test app::git::tests::unstage_works_before_the_first_commit ... ok +test app::preferences::tests::runtime_config_updates_after_lock_poisoning ... ok +test app::git::tests::libgit2_status_merges_staged_and_worktree_changes ... ok +test app::projects::tests::discarding_a_session_removes_every_checkpoint_stage ... ok +test app::projects::tests::draft_titles_follow_the_stored_session_count ... ok +test agent::tests::denial_and_stop_cancel_commands_awaiting_approval ... ok +test app::projects::tests::session_states_are_exclusive_and_ordered ... ok +test app::projects::tests::sweeping_removes_checkpoints_of_sessions_that_no_longer_exist ... ok +test app::projects::tests::git_state_lists_and_switches_local_branches ... ok +test app::tests::background_activity_drives_polling_indicators_and_quit_confirmation ... ok +test agent::tests::shell_environment_probe_stops_blocked_startup_files ... ok +test app::git::tests::origin_fetch_pull_and_push_use_the_current_branch ... ok +test app::tests::chat_html_export_embeds_loaded_a2ui_images_as_data_urls ... ok +test agent::tests::oversized_shell_output_is_bounded_and_retained_until_cleanup ... ok +test app::tests::chat_only_follows_updates_while_near_the_tail ... ok +test app::tests::ds4_gib_and_streaming_cache_inputs_are_typed ... ok +test app::tests::one_shot_titles_are_reduced_to_a_single_sidebar_line ... ok +test app::tests::owned_runtime_paths_stay_in_application_support ... ok +test app::tests::preferences_shortcut_and_dspark_support_are_explicit ... ok +test app::tests::source_does_not_depend_on_a_sibling_ds4_checkout ... ok +test app::tests::stored_session_always_selects_its_model ... ok +test app::tests::tab_scrolls_a_field_back_into_the_preferences_viewport ... ok +test app::view::a2ui::tests::renderer_input_helpers_cover_dates_numbers_choices_and_weights ... ok +test app::view::chat::tests::chat_divider_groups_token_counts_by_thousands ... ok +test app::view::chat::tests::composer_uses_shift_enter_for_line_breaks ... ok +test app::view::git::tests::split_diff_width_covers_the_longest_side_and_tabs ... ok +test app::tests::chat_export_preserves_completed_svg_and_keeps_failures_generic ... ok +test app::view::tests::action_buttons_share_geometry ... ok +test app::view::tests::context_pie_wedge_follows_the_fill_grade ... ok +test app::view::tests::download_measurements_are_readable ... ok +test app::view::tests::raised_surfaces_stay_dark ... ok +test compaction::tests::a_new_summary_replaces_the_previous_rebuild_summary ... ok +test compaction::tests::hard_trigger_and_retry_reserve_match_the_reference ... ok +test compaction::tests::soft_trigger_matches_reference_thresholds ... ok +test compaction::tests::summary_budget_keeps_answer_room_and_rejects_exhausted_contexts ... ok +test compaction::tests::summary_control_markup_is_private ... ok +test compaction::tests::tail_prefers_the_first_user_boundary_after_target ... ok +test config::tests::defaults_write_an_empty_file_and_reload_unchanged ... ok +test config::tests::deprecated_flash_config_migrates_and_persists_only_0731 ... ok +test config::tests::explicit_0731_dspark_opt_out_survives_the_default ... ok +test config::tests::invalid_files_are_reported_instead_of_reset ... ok +test config::tests::legacy_flat_model_settings_are_dropped_but_the_prompt_is_kept ... ok +test config::tests::model_profiles_expose_only_their_upstream_thinking_modes ... ok +test app::preferences::tests::selectors_rehydrate_their_generation_and_model_profiles ... ok +test config::tests::only_changed_values_are_written_and_read_back ... ok +test config::tests::qwen_selection_and_native_defaults_survive_restart ... ok +test app::preferences::tests::multiline_system_prompt_round_trips_through_the_editor ... ok +test app::generation::tests::legacy_generation_rows_collapse_into_their_user_turn ... ok +test app::generation::tests::model_history_uses_persisted_content_without_changing_the_transcript ... ok +test app::view::stats::tests::current_session_summary_uses_persisted_chat_facts ... ok +test app::generation::tests::assistant_markdown_keeps_llm_tables ... ok +test app::generation::tests::forced_compaction_requires_new_visible_chat ... ok +test app::generation::tests::last_compaction_selects_its_tail_without_hiding_history ... ok +test app::tests::assistant_stream_keeps_reasoning_separate_from_the_answer ... ok +test app::generation::tests::extension_context_deduplicates_session_start_and_rearms_after_compaction ... ok +test app::generation::tests::complete_tool_call_in_reasoning_gets_one_correction ... ok +test app::tests::chat_export_formats_visible_turns_reasoning_and_bash_tools ... ok +test app::tests::chat_html_export_is_safe_standalone_and_renders_embedded_surfaces ... ok +test app::generation::tests::a2ui_auto_switch_waits_for_a_renderable_surface ... ok +test dev_brain::tests::path_confinement_and_unrelated_notes_are_preserved ... ok +test database::tests::context_work_reactivates_an_archived_session ... ok +test dsml::tests::parses_reference_and_legacy_dsml_syntaxes ... ok +test dsml::tests::recovers_complete_invokes_before_an_incomplete_one ... ok +test dsml::tests::recovers_complete_invokes_without_the_outer_closing_tag ... ok +test engine::ds4_sampling::tests::heap_fallback_preserves_rng_and_signed_zero_ties ... ok +test engine::gguf::tests::accepts_exact_mxfp4_block_layout ... ok +test database::tests::a2ui_dismissal_persists_a_fresh_surface_boundary ... ok +test engine::gguf::tests::keeps_unknown_tensor_kinds_rejected ... ok +test engine::gguf::tests::mxfp4_scalar_dot_matches_independent_values ... ok +test engine::gguf::tests::maps_metadata_and_tensor_payload_without_copying_weights ... ok +test engine::gguf::tests::rejects_mxfp4_dimension_overflow ... ok +test database::tests::inline_svg_tool_call_survives_session_switch_compaction_and_reopen ... ok +test database::tests::sessions_are_ordered_by_recent_use_within_sidebar_groups ... ok +test engine::gguf::tests::rejects_mxfp4_rows_that_are_not_block_aligned ... ok +test engine::gguf::tests::rejects_truncated_mxfp4_payload ... ok +test engine::metal::glm::tests::dsa_indexer_schedule_matches_the_reference ... ok +test engine::metal::glm::tests::glm53_m5_text_performance_gate ... ignored, requires the installed GLM 5.3 Flash Q2 checkpoint and Apple Metal +test engine::metal::glm::tests::glm53_m5_vision_performance_and_oracle_gate ... ignored, requires GLM 5.3 Q2, its vision sidecar, a fixed image, and Apple Metal +test engine::metal::glm::tests::glm53_reference_logits_replay_separates_sampling_from_execution ... ignored, requires the installed GLM 5.3 Flash Q2 checkpoint and Apple Metal +test engine::metal::glm::tests::glm53_reference_prompt_tokens_match_shared_runtime ... ignored, installed GLM and DS4SERVER_GLM_REFERENCE_LOG from the standalone reference +test engine::metal::glm::tests::glm53_two_row_verifier_restores_recurrent_state ... ignored, installed GLM 5.3 and Metal; run under test-supervisor +test engine::metal::glm::tests::glm_byte_budget_reserves_prefill_before_dynamic_experts ... ok +test engine::metal::glm::tests::glm_mtp_preserves_target_tokens_and_drafts ... ignored, requires the 197 GiB GLM 5.2 checkpoint and Apple Metal +test engine::metal::glm::tests::glm_prefill_schedule_matches_ds4_boundaries ... ok +test engine::metal::glm::tests::glm_resident_decode_flushes_periodically_without_a_final_or_ssd_flush ... ok +test engine::metal::glm::tests::repeated_glm_prompt_rewinds_one_token_for_logits ... ok +test engine::metal::glm::tests::resident_and_streamed_glm_match_ds4_decode_oracles ... ignored, requires the 197 GiB GLM 5.2 checkpoint and Apple Metal +test engine::metal::glm::tests::streamed_glm_uses_ds4_indexed_prefill_for_long_prompts ... ignored, requires the 197 GiB GLM 5.2 checkpoint and Apple Metal +test engine::metal::gpu::qwen_mtplx_allocation_tests::backend_allocation_policy_is_explicit_inside_and_outside_qwen_scope ... ignored, requires Apple Metal; allocation only, no GPU dispatch or model +test engine::metal::gpu::qwen_mtplx_allocation_tests::dispatch_retains_allocation_without_changing_data_donation ... ignored, requires Apple Metal, no model weights +test engine::metal::gpu::qwen_mtplx_allocation_tests::empty_storage_preserves_data_identity_views_and_zero_allocator_usage ... ignored, requires Apple Metal context; empty descriptors, no GPU allocation +test engine::metal::gpu::qwen_mtplx_allocation_tests::mtplx_tensor_cpu_access_releases_native_storage ... ignored, requires Apple Metal; CPU buffer access only, no GPU dispatch or model +test engine::metal::markov::tests::installed_markov_worker_dispatch ... ignored, requires installed 0731 DSpark support; CPU dispatch diagnostic, not parity acceptance +test engine::metal::markov::tests::markov_workers_reuse_threads_and_buffers_with_ordered_ties ... ok +test engine::metal::power_throttle_keeps_ds4_ewma_and_full_power_bypass ... ok +test engine::kvstore::tests::opening_reclaims_checkpoints_the_index_cannot_reach ... ok +test engine::metal::qwen::tests::affine_split_k_matches_reference_shapes_and_scratch_bound ... ok +test engine::metal::qwen::tests::dense_attention_crossover_is_phase_specific ... ok +test engine::kvstore::tests::budget_evicts_the_least_valuable_unprotected_entry ... ok +test engine::metal::qwen::tests::qwen_affine_qmv_and_qmm_match_mlx_reference ... ignored, requires the pinned Qwen artifact set and Apple Metal +test engine::metal::qwen::tests::qwen_affine_qmv_profile ... ignored, requires the pinned 105 GB Qwen artifact set and Apple Metal +test engine::metal::qwen::tests::qwen_core_boundary_and_checkpoint_are_stable ... ignored, requires the pinned 105 GB Qwen artifact set and Apple Metal +test engine::metal::qwen::tests::qwen_fused_gdn_input_rows_match_separate_projections ... ignored, requires the pinned Qwen artifact set and Apple Metal +test engine::metal::qwen::tests::qwen_gdn_conv_norm_rows_matches_mtplx ... ignored, requires Apple Metal +test engine::metal::qwen::tests::qwen_gdn_delta_rows_matches_mtplx ... ignored, requires Apple Metal +test engine::metal::qwen::tests::qwen_layer_profile ... ignored, requires the pinned 105 GB Qwen artifact set and Apple Metal +test engine::metal::qwen::tests::qwen_lazy_target_probabilities_match_batched_sampling ... ignored, requires the pinned Qwen metadata and Apple Metal; no model inference +test dev_brain::tests::skill_index_migration_does_not_overwrite_an_unrelated_root_note ... ok +test engine::metal::qwen::tests::qwen_m5_performance_gate ... ignored, requires the pinned 105 GB Qwen artifact set and Apple Metal +test engine::metal::qwen::tests::qwen_metal_primitives_match_reference_vectors ... ignored, requires Apple Metal +test engine::metal::qwen::tests::qwen_mtp_matches_target_and_restores_its_cache ... ignored, requires the pinned 105 GB Qwen artifact set and Apple Metal +test engine::metal::qwen::tests::qwen_ple_gather_copies_only_the_requested_row ... ok +test database::tests::session_model_migration_preserves_data_and_accepts_catalog ... ok +test engine::metal::qwen::tests::qwen_qsa_dense_mask_accepts_unsorted_blocks ... ignored, requires Apple Metal +test engine::metal::qwen::tests::qwen_qsa_full_context_preallocation_succeeds ... ignored, requires the pinned 105 GB Qwen artifact set and Apple Metal +test engine::metal::qwen::tests::qsa_selection_and_capacity_cover_the_full_native_window ... ok +test engine::metal::qwen::tests::qwen_qsa_logical_depth_oracles_cover_prefill_decode_and_state ... ignored, requires the pinned 105 GB Qwen artifact set and Apple Metal +test engine::metal::qwen::tests::qwen_qsa_real_layer_executes_the_first_sparse_token ... ignored, requires the pinned 105 GB Qwen artifact set and Apple Metal +test engine::metal::qwen::tests::qwen_qsa_selection_and_attention_remain_bounded_at_native_depths ... ignored, requires Apple Metal and allocates the full QSA score window +test engine::metal::qwen::tests::qwen_reference_layer_trace ... ignored, diagnostic trace against the pinned MLX-LM reference +test engine::metal::qwen::tests::qwen_reference_sdpa_trace ... ignored, diagnostic comparison with captured MTPLX SDPA inputs +test engine::metal::qwen::tests::qwen_reference_stateful_trace ... ignored, diagnostic trace against the pinned MLX-LM reference +test engine::metal::qwen::tests::qwen_reference_verify_trace ... ignored, diagnostic trace against the pinned MTPLX verifier +test engine::metal::qwen::tests::qwen_sorted_routed_prefill_matches_grouped_output ... ignored, requires the pinned 105 GB Qwen artifact set and Apple Metal +test engine::metal::qwen::tests::qwen_stage_counters_preserve_async_batches ... ignored, requires pinned Qwen embeddings and Apple Metal; stage profiler opt-in +test engine::metal::qwen::tests::qwen_target_submission_profile ... ignored, requires the pinned 105 GB Qwen artifact set and Apple Metal +test engine::metal::qwen::tests::qwen_verify_layer_profile ... ignored, requires the pinned 105 GB Qwen artifact set and Apple Metal +test engine::metal::qwen_mtplx::allocator::mtplx_allocations_preserve_logical_bounds_with_reference_rounding ... ignored, requires Apple Metal, no model weights +test engine::metal::qwen_mtplx::allocator::mtplx_native_allocator_heap_limits_and_gpu_lifetime ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx::allocator::mtplx_native_allocator_replays_reference_allocations ... ignored, requires Apple Metal, no model weights +test engine::metal::qwen_mtplx::ar::mtplx_ar_driver_matches_reference ... ignored, requires Apple Metal; unchanged MTPLX generate_ar orchestration oracle +test engine::metal::qwen_mtplx::array::mtplx_array_detach_clears_every_siblings_inputs_and_primitive ... ok +test engine::metal::qwen::tests::qwen_ple_hash_contract_matches_golden_boundaries ... ok +test engine::metal::qwen_mtplx::array::mtplx_array_materialization_keeps_geometry_and_rejects_short_storage ... ignored, requires Apple Metal; typed materialized descriptors without model weights +test engine::metal::qwen_mtplx::array::mtplx_array_layout_preserves_dtype_shape_stride_and_materialization_flags ... ok +test engine::metal::qwen_mtplx::array::mtplx_dtype_promotion_matches_all_reference_pairs ... ok +test engine::kvstore::tests::longest_compatible_prefix_wins_and_hits_survive_reopen ... ok +test engine::metal::qwen_mtplx::attention::mtplx_qsa_dense_mask_graph_matches_reference ... ignored, requires Apple Metal; original MTPLX block mask including sentinel and tails +test engine::metal::qwen_mtplx::attention::mtplx_qsa_eager_array_graph_matches_reference ... ignored, requires Apple Metal, no model weights +test engine::metal::qwen_mtplx::attention::mtplx_qsa_prefill_gather_graph_matches_reference ... ignored, requires Apple Metal; actual MTPLX tiled prefill gather +test engine::metal::qwen_mtplx::attention::mtplx_qsa_rows_gather_graph_matches_reference ... ignored, requires Apple Metal; actual MTPLX QSA rows-gather attention +test engine::metal::qwen_mtplx::attention::mtplx_sdpa_fallback_graph_matches_reference ... ignored, requires Apple M5 Max; actual Qwen SDPA fallback reference +test engine::metal::qwen_mtplx::binary::mtplx_graph_binary_preserves_reference_branches ... ignored, requires Apple Metal; binary graph broadcast/layout and donation branches +test engine::metal::qwen_mtplx::binding::mtplx_installed_module_binding_matches_reference ... ignored, requires installed DS4_QWEN38_ARTIFACTS and SSD policy; only small norms and four table rows evaluated +test engine::metal::qwen_mtplx::cache::mtplx_kv_cache_graph_matches_reference ... ignored, requires Apple Metal; actual MTPLX KVCache growth, trim and state receipts +test engine::metal::qwen_mtplx::cache::mtplx_qsa_cache_graph_matches_reference ... ignored, requires Apple Metal; actual MTPLX positional cache, mirror and held state aliases +test engine::metal::qwen_mtplx::compile_graph::mtplx_compile_scalar_bits_and_custom_kernel_identity ... ignored, requires Metal buffers and external supervisor; scalar ownership only, no GPU dispatch +test engine::metal::qwen_mtplx::context_copy::prompt_copy_match_and_backoff_preserve_reference_policy ... ok +test engine::metal::qwen_mtplx::decoder::mtplx_decoder_connected_attention_and_moe_advance_caches ... ignored, requires Apple Metal and external test-supervisor; complete decoder/cache smoke +test engine::metal::qwen_mtplx::decoder::mtplx_decoder_residual_preserves_graph_order ... ok +test engine::metal::qwen_mtplx::dense::mtplx_dense_attention_batches_match_reference ... ignored, requires Apple M5 Max; actual BF16 batched matmul reference +test engine::metal::qwen_mtplx::dense::mtplx_dense_float_graph_matches_reference ... ignored, requires Apple M5 Max; floating Matmul factory and original dispatch +test engine::metal::qwen_mtplx::compiled::mtplx_replay_replaces_descriptors_without_rebuilding_primitives ... ok +test engine::metal::qwen_mtplx::dense::mtplx_qsa_score_array_graph_matches_reference ... ignored, requires Apple M5 Max; canonical QSA F32 graph with the original TF32 setting +test engine::metal::qwen_mtplx::encoder::mtplx_empty_bindings_preserve_nil_dependencies_without_dummy_storage ... ignored, requires Apple Metal; empty original-kernel grids and nil bindings +test engine::metal::qwen_mtplx::allocator::mtplx_allocator_cache_matches_live_reference_trace ... ok +test engine::metal::qwen_mtplx::encoder::mtplx_encoder_commits_after_primitives_and_balances_completion ... ignored, requires Apple Metal, no model weights +test engine::metal::qwen_mtplx::encoder::mtplx_encoder_scope_routes_operators_and_allocator ... ignored, requires Apple Metal, no model weights +test engine::metal::qwen_mtplx::encoder::mtplx_encoder_shared_events_and_error_completion_order ... ignored, requires Apple Metal, no model weights +test engine::metal::qwen_mtplx::encoder::mtplx_encoder_untracked_dependencies_across_encoders_and_commands ... ignored, requires Apple Metal, no model weights +test engine::metal::qwen_mtplx::eval::execution_tests::mtplx_eval_drains_failure_preserves_cause_and_retries_only_failed_nodes ... ignored, requires Apple Metal; supervised evaluator failure and retry +test database::tests::migrations_and_crud_work ... ok +test engine::metal::qwen_mtplx::eval::execution_tests::mtplx_eval_releases_intermediates_and_preserves_descriptor_donation ... ignored, requires Apple Metal; graph ownership and last-consumer release +test engine::metal::qwen_mtplx::encoder::mtplx_encoder_barrier_epochs_and_commit_thresholds ... ok +test engine::metal::qwen_mtplx::eval::execution_tests::mtplx_eval_retains_tracer_topology_without_input_donation ... ignored, requires Apple Metal; evaluator tracer donation and retained topology +test engine::metal::qwen_mtplx::eval::execution_tests::mtplx_eval_runs_cpu_gpu_siblings_and_async_continuations ... ignored, requires Apple Metal; tiny supervised CPU/GPU evaluator graph +test engine::metal::qwen_mtplx::eval::mtplx_eval_tape_preserves_scheduled_detach_and_tracer_errors ... ok +test engine::metal::qwen_mtplx::execution::mtplx_full_installed_ar_matches_reference ... ignored, full installed model; external guard and DS4_QWEN38_AR_REFERENCE required +test engine::metal::qwen_mtplx::eval::mtplx_eval_tape_tracks_stream_fences_per_leaf_and_cross_device_union ... ok +test engine::metal::qwen_mtplx::eval::mtplx_eval_tape_preserves_bfs_width_and_sibling_choice ... ok +test engine::metal::qwen_mtplx::execution::mtplx_full_installed_mtp_prefill_matches_reference ... ignored, full installed MTP model; external guard and DS4_QWEN38_MTP_PREFILL_REFERENCE required +test engine::metal::qwen_mtplx::execution::mtplx_full_installed_ping_forward_matches_reference ... ignored, full installed model; requires external memory guard and DS4_QWEN38_FORWARD_REFERENCE +test engine::metal::qwen_mtplx::execution::qwen_power_throttle_drains_before_sleep_and_bypasses_at_full_power ... ignored, requires Apple Metal; run under test-supervisor +test engine::metal::qwen_mtplx::fused::mtplx_compiled_fusion_gpu_matches_reference ... ignored, requires Metal and external supervisor; generated fusion vs pinned SiLU plus multi-output/scalar dispatch +test engine::metal::qwen_mtplx::fused::mtplx_compiled_constant_spelling ... ok +test engine::metal::qwen_mtplx::gdn::mtplx_graph_gdn_forward_matches_model_reference ... ignored, requires Apple Metal; actual MTPLX GDN forward and cache receipts +test engine::metal::qwen_mtplx::gdn::mtplx_graph_gdn_prefill_and_verify_match_model_reference ... ignored, requires Apple Metal; complete GDN Conv1d prefill and fused verify graphs +test engine::metal::qwen_mtplx::gdn::mtplx_graph_gdn_staged_primitives_match_reference ... ignored, requires Apple Metal; 80 actual delta-update receipts and six conv-normalization kernels +test engine::metal::qwen_mtplx::gdn::mtplx_graph_gdn_step_preserves_views_and_siblings ... ignored, requires Apple Metal; GDN custom primitive strided copies and sibling roots +test engine::metal::qwen_mtplx::graph_sync::mtplx_graph_event_snapshots_preserve_values_streams_and_shared_errors ... ignored, requires Apple Metal events, no model weights +test engine::metal::qwen_mtplx::graph_sync::mtplx_graph_fence_coherence_preserves_empty_and_partial_word_spans ... ignored, requires Apple Metal3, model-free empty coherent dispatch +test engine::metal::qwen_mtplx::graph_sync::mtplx_graph_fences_transfer_cpu_gpu_gpu_cpu_in_both_modes ... ignored, requires Apple Metal3, tiny model-free coherent fence kernels +test engine::metal::qwen_mtplx::hyper::mtplx_graph_hyper_forward_matches_reference ... ignored, requires Apple M5 Max; actual MTPLX GatedResidual reference receipts +test engine::metal::qwen_mtplx::hyper::mtplx_graph_hyper_pack_and_reads_match_reference ... ignored, requires Apple Metal; original hyper primitives and runtime pack +test engine::metal::qwen_mtplx::indexing::mtplx_graph_indexing_preserves_layouts_and_offsets ... ignored, requires Apple Metal; Select layout branches, GatherAxis views and empty arguments +test engine::metal::qwen_mtplx::indexing::mtplx_scatter_axis_graph_matches_reference ... ignored, requires Apple Metal; pinned Bool ScatterAxis layout and broadcast paths +test engine::metal::qwen_mtplx::issue103_analysis::issue103_numeric_receipts ... ignored, #103 diagnostic; Metal required, eager versus compiled numeric operands +test engine::metal::qwen_mtplx::issue103_analysis::issue103_sampling_receipts ... ignored, #103 diagnostic; Metal required, pins currently broken sampling law and invalid rows +test engine::metal::qwen_mtplx::issue103_analysis::issue103_sorted_gather_receipts ... ignored, #103 diagnostic; M5 and pinned runtime shader required; initialized sentinels +test engine::metal::qwen_mtplx::issue103_analysis::issue103_tokenizer_receipts ... ignored, #103 diagnostic; installed tokenizer and latest oracle JSONL; no GPU +test engine::metal::qwen_mtplx::issue103_analysis::issue103_vision_position_receipts ... ignored, #103 diagnostic; small active attention module on Metal; mixed position boundary +test engine::metal::qwen_mtplx::issue104::issue104_installed_ar_stream_and_state ... ignored, full pinned Bare-Speed model; external memory guard required +test engine::metal::qwen_mtplx::issue105::issue105_batched_greedy_rejects_each_invalid_row ... ignored, Metal required; run serially under test-supervisor +test engine::metal::qwen_mtplx::issue106::issue106_complete_state_and_checkpoint_recovery ... ignored, installed model and actual pre-fix checkpoint; external memory guard required +test engine::metal::qwen_mtplx::issue106::issue106_upstream_exit_matrix ... ignored, installed model, scripted logits on real caches; external memory guard required +test engine::metal::qwen_mtplx::issue108::issue108_attention_chunk_positions ... ignored, Metal and pinned MTPLX chunk fixtures; external supervisor required +test engine::metal::qwen_mtplx::issue109::issue109_gate_phase_and_dtype_laws ... ignored, Metal and exhaustive pinned gate fixtures; external supervisor required +test engine::metal::qwen_mtplx::issue110::issue110_actual_projection_rows_match_oracle ... ignored, installed layer weights and pinned oracle receipts; external memory supervisor required +test engine::metal::qwen_mtplx::issue110::issue110_guard_allocation_refusal_releases_graph_and_retries ... ignored, Metal allocation refusal and retry; external supervisor required +test engine::metal::qwen_mtplx::issue110::issue110_large_cold_and_warm_prefill ... ignored, full installed model and large partial chunks; serial memory supervisor required +test engine::metal::qwen_mtplx::issue112_bench::issue112_hidden_prefill ... ignored, full installed model hidden-state prefill; serial supervisor required +test engine::metal::qwen_mtplx::issue112_bench::issue112_paired_prefill ... ignored, full installed model; serial memory supervisor and explicit output directory +test engine::metal::qwen_mtplx::linear::mtplx_graph_affine_dequantize_matches_reference ... ignored, requires Apple Metal; original table dequantize dtype/group/bit/layout receipts +test engine::metal::qwen_mtplx::linear::mtplx_graph_affine_quantize_matches_reference ... ignored, requires Apple Metal; original affine quantize dtype/group/bit/layout receipts +test engine::metal::qwen_mtplx::linear::mtplx_graph_gather_qmm_matches_reference ... ignored, requires Apple Metal; original GatherQMM array layouts and expert routing +test engine::metal::qwen_mtplx::linear::mtplx_graph_quantized_linear_batched_identity ... ignored, requires Apple Metal and external supervisor; strided/broadcast batched affine dispatch +test engine::metal::qwen_mtplx::linear::mtplx_graph_quantized_linear_matches_reference ... ignored, requires Apple M5 Max Metal; 78 pinned affine fixtures through lazy graph +test engine::metal::qwen_mtplx::load::mtplx_safetensors_load_laziness_boundaries_and_lifetime ... ignored, requires Apple Metal; bounded CPU Load and dependent GPU graph +test engine::metal::qwen_mtplx::mlp::mtplx_graph_shared_mlp_matches_reference ... ignored, requires Apple M5 Max; actual MTPLX shared MLP reference receipts +test engine::metal::qwen_mtplx::linear::sorted_gather_guard_matches_pinned_call_predicates ... ok +test engine::metal::qwen_mtplx::mlp::mtplx_graph_split_and_compiled_silu_layouts ... ignored, requires Apple Metal; Split sibling ownership and compiled SiLU layouts +test engine::metal::qwen_mtplx::moe::mtplx_graph_sparse_moe_matches_reference ... ignored, requires Apple M5 Max; full MoE Array graph, no model weights; use test-supervisor +test engine::metal::qwen_mtplx::model::mtplx_model_compile_policy_and_run_boundaries ... ok +test engine::metal::qwen_mtplx::moe_sorted::issue112_all_kernel_variants ... ignored, Metal synthetic all supported row-map variants; external supervisor +test engine::metal::qwen_mtplx::moe_sorted::issue112_canary_failures ... ignored, Metal canary rejection and sticky fallback; external supervisor +test engine::metal::qwen_mtplx::moe_sorted::issue112_full_model_state ... ignored, full installed model; validates all cold/warm state receipts against the pre-port oracle +test engine::metal::qwen_mtplx::moe_sorted::issue112_installed_gate_up ... ignored, installed projection weights; external supervisor required +test engine::metal::qwen_mtplx::moe_sorted::row_map_applicability ... ok +test engine::metal::qwen_mtplx::ngram::mtplx_ngram_embedding_matches_reference ... ignored, requires Apple Metal; full resident NGram graph and lazy decode history +test engine::metal::qwen_mtplx::ngram::mtplx_ngram_gpu_rows_and_history_match_reference ... ignored, requires Apple Metal; original lazy NGram GPU row graph, no table +test engine::metal::qwen_mtplx::ngram::mtplx_ngram_resident_matches_reference ... ignored, requires Apple Metal; original NGramTable resident gather/dequantize receipts +test engine::metal::qwen_mtplx::ngram::mtplx_ngram_table_priority ... ignored, requires Apple Metal; NGram table routing and missing-sidecar behavior +test engine::metal::qwen_mtplx::ngram_sidecar::mtplx_ngram_sidecar_matches_reference ... ignored, requires Apple Metal; actual file-backed MTPLX sidecar/LRU/dequantization receipts +test database::tests::chat_and_compaction_history_survive_reopen_and_session_deletion ... ok +test engine::metal::qwen_mtplx::ngram_stage::mtplx_ngram_stage_allclose_branches ... ignored, requires Apple Metal; stage verification special values and original reduction branches +test engine::metal::qwen_mtplx::ngram_stage::mtplx_ngram_stage_matches_reference ... ignored, requires Apple Metal; original complete stage lifecycle and file-backed tables +test engine::metal::qwen_mtplx::normalization::mtplx_graph_norm_modules_match_reference ... ignored, requires Apple Metal; connected Qwen normalization graph golden fixtures +test engine::metal::qwen_mtplx::normalization::mtplx_graph_rms_norm_preserves_reference_layout_and_values ... ignored, requires Apple Metal; graph RMSNorm donation, copy, broadcast and looped kernels +test engine::metal::qwen_mtplx::normalization::mtplx_logsumexp_graph_matches_reference ... ignored, requires Apple Metal; original sampler LogSumExp branches +test engine::metal::qwen_mtplx::normalization::mtplx_softmax_graph_storage_matches_reference ... ignored, requires Apple Metal; original Softmax type and storage branches +test engine::metal::qwen_mtplx::ops::mtplx_concatenate_preserves_general_general_copy_semantics ... ignored, requires Apple Metal; Concatenate promotion, offsets, strided writers and validation +test engine::metal::qwen_mtplx::ops::mtplx_owned_operations_build_and_execute_qsa_layout_graph ... ignored, requires Apple Metal; self-contained lazy QSA-layout recipe, no callback map +test engine::metal::qwen_mtplx::ops::mtplx_slice_and_contiguous_preserve_cache_window_semantics ... ignored, requires Apple Metal; normalized Slice and Contiguous cache-window graph +test engine::metal::qwen_mtplx::owner::issue105_product::issue105_product_ar_cleanup_and_http_retry ... ignored, installed Qwen model; serial test-supervisor with memory guard required +test engine::metal::qwen_mtplx::owner::issue105_product::issue105_product_mtp_cleanup_and_http_retry ... ignored, installed Qwen MTP model; serial test-supervisor with memory guard required +test engine::metal::qwen_mtplx::owner::issue106_product::issue106_product_discards_old_checkpoint_and_recovers_cold ... ignored, installed model and actual pre-fix checkpoint; external memory guard required +test engine::metal::qwen_mtplx::owner::issue107_product::issue107_vision_product ... ignored, installed model plus vision tower; serial external memory supervisor required +test engine::metal::qwen_mtplx::owner::issue109_product::issue109_verify_rows_and_warm_checkpoint ... ignored, installed model; serial external memory supervisor required +test engine::metal::qwen_mtplx::fused::mtplx_compiled_emitter_matches_all_pinned_silu_bodies ... ok +test engine::metal::qwen_mtplx::owner::issue111_product::issue111_token_prefix_cache ... ignored, installed model; serial external memory supervisor required +test engine::metal::qwen_mtplx::owner::qwen_product_generator_chat_matches_reference ... ignored, full installed model through product Generator; external supervisor and chat reference required +test engine::metal::qwen_mtplx::owner::qwen_vision_chat_checkpoint_preserves_image_identity ... ignored, requires installed Qwen, Metal, and DS4_QWEN_VISION_IMAGE; run under test-supervisor +test engine::metal::qwen_mtplx::fused::mtplx_compile_fusion_preserves_parent_and_output_boundaries ... ok +test engine::metal::qwen_mtplx::owner::qwen_mtp_progress_publishes_without_turn_completion_or_double_counting ... ok +test engine::metal::qwen_mtplx::ple::mtplx_graph_ple_connected_matches_reference ... ignored, requires Apple M5 Max; complete original PLELayer with real lookup +test engine::metal::qwen_mtplx::ple::mtplx_graph_ple_projection_and_cache_match_reference ... ignored, requires Apple M5 Max; actual MTPLX PLELayer after embedding lookup +test engine::metal::qwen_mtplx::policy::qwen_server_policy_matches_original_functions ... ignored, requires DS4_QWEN38_POLICY_REFERENCE from pinned MTPLX; CPU-only +test engine::metal::qwen_mtplx::prefill::mtplx_mtp_prefill_driver_matches_reference ... ignored, requires Apple Metal; original streaming MTP history prefill +test engine::metal::qwen_mtplx::policy::sorted_moe_switch_and_family_rehearsal ... ok +test engine::metal::qwen_mtplx::prefill::mtplx_prefill_driver_matches_reference ... ignored, requires Apple Metal; original _prefill control flow and raw cache roots +test engine::metal::qwen_mtplx::qsa_attention::mtplx_qsa_attention_module_matches_reference ... ignored, requires Metal and unchanged whole-Attention receipts; no model download +test engine::metal::qwen_mtplx::qsa_compile::mtplx_compiled_indexer_array_replay_matches_reference ... ignored, requires Metal and original compiled indexer receipts; no model weights +test engine::metal::qwen_mtplx::qsa_core::mtplx_qsa_core_host_matches_reference ... ignored, requires Metal and original host-core receipts; no model weights +test engine::metal::qwen_mtplx::qsa_graph::qsa_cache_donation_requires_descriptor_data_and_allocation_contract ... ignored, requires Apple Metal, no model weights +test engine::metal::qwen_mtplx::qsa_graph::qsa_completion_owns_buffers_until_gpu_finishes ... ignored, requires Apple Metal, no model weights +test engine::metal::qwen_mtplx::qsa_graph::qsa_evaluator_retains_inputs_and_siblings_not_primary_data ... ignored, requires Apple Metal, no model weights +test engine::metal::qwen_mtplx::qsa_indexer::issue107::issue107_real_geometry_query_and_block_start_positions ... ignored, Metal and independently verified pinned indexer fixtures; external supervisor required +test engine::metal::qwen_mtplx::qsa_indexer::mtplx_qsa_canonical_indexer_routes_match_reference ... ignored, requires Metal and original ongoing indexer routing receipts; no weights +test engine::metal::qwen_mtplx::qsa_indexer::mtplx_qsa_indexer_compiled_commit_matches_reference ... ignored, requires Metal and original indexer lifecycle receipts; no model weights +test engine::metal::qwen_mtplx::qsa_indexer::mtplx_qsa_indexer_prefix_matches_reference ... ignored, requires Apple Metal, original stateful QSAIndexer receipts, no model weights +test engine::metal::qwen_mtplx::qsa_prefill::mtplx_qsa_prefill_graph_matches_reference ... ignored, requires Metal and original two-stage prefill receipts, no weights +test engine::metal::qwen_mtplx::qsa_prepare::mtplx_qsa_prepare_graph_matches_reference ... ignored, requires Apple Metal; parameterized original QSA preparation and traced positions +test engine::metal::qwen_mtplx::qsa_select::mtplx_qsa_fused_graph_matches_reference ... ignored, requires Apple Metal and original QSA selector receipts; no model weights +test engine::metal::qwen_mtplx::random::mtplx_sampler_prefix_matches_reference ... ignored, requires Apple Metal; original target-prefix sampler and default RNG +test engine::metal::qwen_mtplx::random::mtplx_sampler_resident_matches_reference ... ignored, requires Apple Metal; original MTPLX resident sampling and keyed RNG +test engine::metal::qwen_mtplx::qsa_graph::qsa_schedule_preserves_the_selected_sibling ... ok +test engine::metal::qwen_mtplx::policy::retired_ar_pipeline_flag_cannot_change_server_or_turn_policy ... ok +test engine::metal::qwen_mtplx::reduce::mtplx_sampler_argmax_matches_reference ... ignored, requires Apple Metal; original MTPLX greedy ArgReduce and storage +test engine::metal::qwen_mtplx::reduce::mtplx_sum_graph_matches_reference ... ignored, requires Apple Metal; original shared sum dispatch and QSA mean +test engine::metal::qwen_mtplx::residency::mtplx_residency_matches_reference_lifecycle_cases ... ignored, requires Apple Metal 3 / macOS 15, no model weights +test engine::metal::qwen_mtplx::rope::mtplx_rope_graph_matches_reference ... ignored, requires Apple Metal; actual MTPLX RoPE, static YaRN and multi-axis receipts +test engine::metal::qwen_mtplx::sampling::mtplx_sampler_batched_matches_reference ... ignored, requires Apple Metal; original MTPLX bound and serial batch distributions +test engine::metal::qwen_mtplx::sampling::mtplx_sampler_entry_matches_reference ... ignored, requires Apple Metal; actual MTPLX generator sampling entry +test engine::metal::qwen_mtplx::sampling::mtplx_sampler_fallback_matches_reference ... ignored, requires Apple Metal; original sparse fallback and host dense sampler +test engine::metal::qwen_mtplx::request::qwen_request_progress_uses_ui_frontiers_and_decode_timer ... ok +test engine::metal::qwen_mtplx::request::qwen_request_settings_override_backend_policy ... ok +test engine::metal::qwen_mtplx::sampling::mtplx_sampler_penalties_match_reference ... ignored, requires Apple Metal; original GPU and CPU raw-logit penalties +test engine::metal::qwen_mtplx::sampling::mtplx_sampler_selection_matches_reference ... ignored, requires Apple Metal; original MTPLX sampler selection, no model weights +test engine::metal::qwen_mtplx::sampling::mtplx_sampler_serial_support_matches_reference ... ignored, requires Apple Metal; actual MTPLX serial candidate route, no weights +test engine::metal::qwen_mtplx::scheduler::mtplx_cpu_primitive_holds_data_and_temporaries_in_fifo_order ... ignored, requires Apple Metal shared storage, no GPU dispatch or model weights +test engine::metal::qwen_mtplx::scheduler::mtplx_cpu_dispatch_counts_tenth_and_completes_after_failed_work ... ok +test engine::metal::qwen_mtplx::compile_graph::mtplx_compile_simplify_preserves_reference_parent_rules ... ok +test engine::metal::qwen_mtplx::scheduler::mtplx_scheduler_cpu_events_propagate_errors_without_consuming_source ... ignored, requires Apple Metal, no model weights +test engine::metal::qwen_mtplx::sdpa::mtplx_sdpa_vector_matches_reference ... ignored, requires Apple M5 Max; actual pinned fused SDPA kernels +test engine::metal::qwen_mtplx::session_cache::mtplx_full_installed_chat_matches_reference ... ignored, full installed model; external guard and DS4_QWEN38_CHAT_REFERENCE required +test engine::metal::qwen_mtplx::session_cache::mtplx_session_boundary_policy ... ok +test engine::metal::qwen_mtplx::session_cache::mtplx_session_final_state_requires_capture_and_safe_cache ... ok +test engine::metal::qwen_mtplx::session_checkpoint::qwen_checkpoint_roundtrip_and_failed_restore_preserve_live_state ... ignored, model-free Metal checkpoint; external supervisor and DS4_QWEN38_CHECKPOINT_DIR required +test engine::metal::qwen_mtplx::session_codec::mtplx_session_codec_host_import_matches_reference ... ignored, model-free Metal imports; external supervisor and DS4_HOST_IMPORT_REFERENCE required +test engine::metal::qwen_mtplx::session_codec::mtplx_session_codec_matches_original_blobs_and_restore ... ignored, tiny GPU arrays; external supervisor and DS4_SESSION_CODEC_REFERENCE required +test engine::metal::qwen_mtplx::sort::mtplx_sort_graph_matches_reference ... ignored, requires Apple Metal, no model weights +test engine::metal::qwen_mtplx::scheduler::mtplx_scheduler_streams_preserve_fifo_errors_and_shutdown ... ok +test engine::metal::qwen_mtplx::sparse_attention::mtplx_sparse_attention_graph_matches_reference ... ignored, requires Apple M5; actual MTPLX sparse Decode and TensorOps Prefill consumers +test engine::metal::qwen_mtplx::speculative::mtplx_full_installed_mtp_generation_matches_reference ... ignored, full installed model; external guard and DS4_QWEN38_MTP_GENERATION_REFERENCE required +test engine::metal::qwen_mtplx::stream::mtplx_stream_routes_queues_events_and_finalizes_all_under_pressure ... ignored, requires Apple Metal, tiny model-free two-queue copy +test engine::metal::profile::tests::profile_reports_locality_and_lru_hits ... ok +test engine::metal::qwen_mtplx::submission::mtplx_submission_attaches_at_flush_eval_finish_and_drop ... ignored, requires Apple Metal, no model weights +test engine::metal::qwen_mtplx::unary::mtplx_graph_unary_preserves_reference_layout_and_values ... ignored, requires Apple Metal; graph unary layout, donation and kernel boundaries +test engine::metal::qwen_mtplx::views::mtplx_dtype_conversion_and_views_preserve_values_layout_and_donation ... ignored, requires Apple Metal; original conversion/view kernels and donation in lazy eval +test engine::metal::qwen_mtplx::views::mtplx_dynamic_slice_graph_matches_reference ... ignored, requires Metal and original dynamic slice receipts; no model weights +test engine::metal::qwen_mtplx::views::mtplx_reshape_shares_or_copies_in_the_connected_evaluator ... ignored, requires Apple Metal; original Reshape copy kernels and shared backing +test engine::metal::qwen_mtplx::views::mtplx_views_preserve_aliases_offsets_strides_and_gpu_output ... ignored, requires Apple Metal; connected zero-copy views and offset-aware original copy kernel +test engine::metal::qwen_mtplx::vision::qwen_vision_tower_matches_mtplx_image ... ignored, requires Metal and pinned Qwen vision artifacts/reference values +test engine::metal::qwen_mtplx::weights::mtplx_checkpoint_projection_fusions_match_reference ... ignored, requires Apple Metal; bounded lazy checkpoint Load and fusion +test engine::metal::qwen_mtplx::weights::mtplx_installed_checkpoint_fusion_metadata_matches_reference ... ignored, requires installed DS4_QWEN38_ARTIFACTS; headers only, never evaluate weights +test engine::metal::qwen_mtplx_tests::mtplx_affine_selection_preserves_reference_boundaries ... ok +test engine::metal::qwen_mtplx_tests::mtplx_canonical_hyper_and_gdn_kernels_match_reference ... ignored, requires Apple Metal, no model weights +test engine::metal::qwen_mtplx::stream::mtplx_stream_registry_preserves_thread_defaults_templates_and_clear ... ok +test engine::metal::qwen_mtplx_tests::mtplx_connected_delta_update_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_connected_gather_sort_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_connected_gdn_decode_matches_model_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_connected_gdn_forward_matches_model_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_connected_gdn_staged_matches_model_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_connected_norm_modules_match_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_connected_router_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_connected_sparse_moe_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_connected_switch_glu_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_gate_up_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_qsa_cache_lifecycle_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_qsa_compiled_backings_and_dynamic_copies_match_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_qsa_compiled_cache_routing_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_qsa_compiled_cache_window_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_qsa_compiled_capacity_matches_reference ... ok +test engine::metal::qwen_mtplx_tests::mtplx_qsa_compiled_indexer_modes_match_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_qsa_compiled_scalar_sources_match_reference ... ok +test engine::metal::qwen_mtplx_tests::mtplx_qsa_connected_cache_selection_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_qsa_eager_topk_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_qsa_f32_scores_match_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_qsa_indexer_preparation_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_qsa_indexer_routes_match_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_qsa_prefill_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_qsa_prefill_producer_dispatch_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_canonical_source_bodies_preserve_pinned_hashes ... ok +test engine::metal::qwen_mtplx_tests::mtplx_qsa_selector_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_runtime_affine_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_runtime_argsort_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx_tests::mtplx_runtime_gather_matches_reference ... ignored, requires Apple M5 Max Metal, no model weights +test engine::metal::qwen_mtplx::scheduler::mtplx_scheduler_activity_preserves_reference_pressure_and_wait_rules ... ok +test engine::metal::tests::batch_raw_span_includes_the_chunk_and_previous_window ... ok +test engine::metal::tests::compression_schedule_tracks_the_deepseek_model_shape ... ok +test engine::metal::tests::decode_feature_policy_keeps_device_generations_and_rollbacks_separate ... ok +test engine::metal::tests::decode_raw_span_tracks_the_logical_sliding_window ... ok +test engine::metal::tests::directional_steering_matches_the_ds4_token_oracle ... ignored, requires the installed Flash GGUF, DS4 steering fixture, and a Metal device +test engine::metal::tests::dspark_confidence_quantizes_q8_input_like_ds4 ... ok +test engine::metal::tests::dspark_markov_activation_matches_q8_rounding ... ok +test engine::metal::tests::dspark_matches_original_summary_cycles ... ignored, requires installed 0731/DSpark and DS4SERVER_DSPARK_REFERENCE cycle recording +test engine::metal::tests::dspark_runs_a_target_owned_greedy_cycle ... ignored, requires the installed 0731 Flash and checkpoint-specific DSpark GGUF fixtures +test engine::metal::tests::dspark_scheduler_matches_the_ds4_default_window ... ok +test engine::metal::tests::dspark_verifier_selects_only_the_committed_row ... ok +test engine::metal::tests::flash_0731_long_context_crosses_indexed_prefill_boundary ... ignored, requires a 0731 Flash GGUF and an Apple M5 device +test engine::metal::tests::flash_0731_m5_decode_performance_gate ... ignored, requires a 0731 Flash GGUF and an Apple M5 device +test engine::metal::tests::flash_0731_resident_and_ssd_streaming_choose_the_same_tokens ... ignored, requires the installed 81 GiB Flash GGUF fixture and a Metal device +test engine::metal::tests::flash_0731_runs_exact_sampled_dspark ... ignored, requires the installed 0731 target and checkpoint-specific DSpark GGUF fixtures +test engine::metal::tests::flash_0731_ssd_streaming_maps_and_seeds_batched_prefill_layers ... ignored, requires the installed 81 GiB Flash GGUF fixture and a Metal device +test engine::metal::tests::generated_hotlists_match_each_model_shape ... ok +test engine::metal::tests::half_conversion_handles_normal_and_subnormal_values ... ok +test engine::metal::tests::pro_q4_model_spans_remain_isolated ... ok +test engine::metal::tests::pro_resident_admission_includes_weights_context_and_scratch ... ok +test engine::metal::tests::pro_ssd_streaming_full_layer_and_selected_batch_agree ... ignored, requires the installed DeepSeek V4 Pro GGUF and Apple Metal +test engine::metal::tests::resident_multi_session_switching_preserves_each_kv_frontier ... ignored, requires the installed 81 GiB Flash GGUF fixture and a Metal device +test engine::metal::tests::ssd_streaming_supports_dspark ... ignored, requires the installed 0731 Flash and checkpoint-specific DSpark GGUF fixtures +test engine::metal::tests::streaming_memory_plan_matches_ds4_graph_formulas ... ok +test engine::metal::vision::tests::glm53_resize_matches_reference_token_grids ... ok +test engine::metal::qwen_mtplx::submission::mtplx_all_native_command_commits_pass_the_submission_hook ... ok +test engine::qwen::tests::metadata_and_safetensors_boundaries_fail_closed ... ok +test engine::qwen::tests::pinned_artifact_set_loads_and_renders_goldens ... ignored, requires DS4_QWEN38_ARTIFACTS to point at the pinned 105 GB source +test engine::qwen::tests::pinned_qwen_metadata_matches_product_without_executor_state ... ignored, requires DS4_QWEN38_ARTIFACTS to point at the pinned 105 GB source +test engine::qwen_vision::qwen_image_cache_keys_distinguish_pixels_and_preserve_prior_text ... ok +test engine::qwen::tests::frozen_inventory_and_memory_categories_are_exact ... ok +test engine::qwen_vision::qwen_vision_positions_and_resize_contract ... ok +test dev_brain::tests::parser_and_index_rebuild_ignore_links_in_code ... ok +test engine::sampling_tests::checkpoint_rebuilds_explain_compatibility_and_history_misses ... ok +test engine::sampling_tests::checkpoint_tag_accepts_an_unchanged_prefix_before_reminders ... ok +test engine::metal::qwen_mtplx::sampling::mtplx_sampler_distribution_and_rng_match_reference ... ok +test engine::sampling_tests::checkpoint_headers_identify_the_exact_model ... ok +test engine::sampling_tests::checkpoint_tag_covers_the_canonical_chat_state ... ok +test engine::sampling_tests::ds4_sampler_real_logits_cpu_benchmark ... ignored, CPU-only; requires DS4_SAMPLER_RECORDING with the recorded GLM logits +test engine::sampling_tests::exact_delta_sampling_accepts_or_corrects_the_draft ... ok +test engine::sampling_tests::generated_text_drains_incomplete_bytes_before_phase_changes_and_finish ... ok +test engine::sampling_tests::metal_executes_real_flash_token ... ignored, requires the 80 GiB Flash checkpoint and Apple Metal +test engine::sampling_tests::generated_text_preserves_thinking_utf8_and_split_stops ... ok +test engine::sampling_tests::qwen_rng_matches_numpy_pcg64 ... ok +test engine::sampling_tests::qwen_sampling_uses_mtplx_global_nucleus_mass_before_top_k ... ok +test engine::sampling_tests::resumed_prefill_crossover_matches_each_ds4_graph ... ok +test engine::sampling_tests::sampling_probabilities_match_ds4_filter_order ... ok +test engine::sampling_tests::split_utf8_token_bytes_are_joined_before_decoding ... ok +test engine::sampling_tests::top_k_and_stream_stops_are_applied_before_output ... ok +test engine::sampling_tests::workspace_instruction_identity_participates_in_append_only_kv_keys ... ok +test engine::sampling_tests::zero_temperature_is_greedy ... ok +test engine::tokenizer::issue111::issue111_ds4_families ... ignored, CPU-only; installed DS4 GGUFs and exact oracle IDs +test engine::tokenizer::issue111::issue111_every_unicode_scalar_split ... ignored, CPU-only; exhaustive pinned Qwen split receipt +test engine::tokenizer::issue111::issue111_qwen_tokens_and_requests ... ignored, CPU-only; installed Qwen tokenizer and pinned exact IDs +test engine::metal::qwen_mtplx_tests::mtplx_qsa_prefill_workspace_matches_reference ... ok +test engine::tokenizer::tests::character_helpers_are_total_at_every_byte_offset ... ok +test engine::tokenizer::tests::ds4_chat_matches_original_session_tokens ... ignored, CPU-only; requires DS4SERVER_CHAT_REFERENCE and its installed GGUF +test engine::tokenizer::tests::qwen_checkpoint_continuation_matches_full_conversation ... ignored, requires the installed Qwen tokenizer, but no GPU or model weights +test engine::tokenizer::tests::qwen_plain_chat_matches_mtplx_server_tokens ... ignored, requires local tokenizer and tools/qwen-chat-reference.py output; no inference +test engine::tokenizer::tests::reasoning_prefixes_match_each_model_family_contract ... ok +test engine::validation::tests::configured_glm53_main_fixture_passes_the_exact_layout ... ok +test engine::validation::tests::configured_glm53_vision_fixture_passes_the_exact_layout ... ok +test engine::tokenizer::issue111::qwen_split_boundaries ... ok +test engine::validation::tests::installed_dspark_fixture_passes_the_target_layout ... ok +test engine::validation::tests::mxfp4_is_limited_to_routed_experts ... ok +test engine::metal::qwen_mtplx::ngram::mtplx_ngram_cpu_rows_and_raw_history_match_reference ... ok +test extensions::tests::duplicate_skill_names_and_update_rollback_are_deterministic ... ok +test dev_brain::tests::validation_names_every_drifted_source_and_requires_semantic_refresh ... ok +test extensions::tests::hook_output_is_bounded_typed_and_event_matched ... ok +test engine::sampling_tests::probability_ratio_speculation_preserves_the_target_distribution ... ok +test extensions::tests::manifest_and_paths_are_validated_without_following_escapes ... ok +test extensions::tests::pinned_ponytail_runs_all_lifecycle_modes ... ignored, downloads the pinned Ponytail reference integration +test extensions::tests::registry_persists_enable_disable_errors_and_uninstall ... ok +test extensions::tests::symlink_and_variable_escapes_are_rejected ... ok +test instructions::tests::changes_removals_resume_and_compaction_are_append_only ... ok +test engine::metal::qwen_mtplx::array::mtplx_array_releases_sibling_cycles_and_deep_input_graphs ... ok +test instructions::tests::discovery_is_global_to_local_deduplicated_and_confined ... ok +test instructions::tests::empty_and_repaired_baselines_do_not_repeat_prompt_content ... ok +test instructions::tests::newly_crossed_scope_is_added_once_and_unavailable_content_is_retained ... ok +test metrics::tests::cache_report_splits_buckets_and_folds_index_files_into_their_checkpoint ... ok +test metrics::tests::decode_timer_excludes_later_work_and_resets_between_requests ... ok +test metrics::tests::prompt_timing_keeps_unmeasured_components_distinct_from_zero ... ok +test metrics::tests::removed_preview_metric_code_stays_decodable ... ok +test metrics::tests::snapshots_track_runtime_and_server_counters ... ok +test model::qwen::qwen_vision_is_an_independent_managed_artifact_set ... ok +test model::qwen::tests::embedded_manifest_is_the_frozen_complete_set ... ok +test model::qwen::tests::verification_rejects_hash_mismatch_and_honors_cancellation ... ok +test model::transfer::tests::cancellation_keeps_the_partial_file_for_the_next_run ... ok +test model::transfer::tests::catalog_and_checksum_verification_are_explicit ... ok +test model::transfer::tests::managed_artifact_inventory_and_delete_include_partial_files ... ok +test model::transfer::tests::qwen_set_verifies_reloads_and_removes_as_one_managed_artifact ... ignored, requires DS4_QWEN38_ARTIFACTS to point at the pinned 105 GB source +test instructions::tests::frames_escape_control_tags_and_enforce_utf8_byte_limits ... ok +test model::transfer::tests::restart_resumes_at_the_existing_partial_byte ... ok +test model::transfer::tests::verification_reports_bytes_read ... ok +test model_eval::tests::acceleration_receipt_reports_effective_sampling_contract ... ok +test dev_brain::tests::skill_validation_and_default_guide_restore_are_strict ... ok +test model_eval::tests::acceleration_switch_uses_each_models_native_path ... ok +test model_eval::tests::canary_cross_phase_samples_keep_their_start_phase ... ok +test model_eval::tests::evaluations_exclude_overlapping_workers_and_release_on_exit ... ok +test model_eval::tests::external_canary_observes_phases_and_finishes_on_eof ... ignored, Metal probe only; DS4SERVER_CANARY_BINARY must point to the current release binary +test model_eval::tests::external_canary_protocol_accepts_only_known_phases ... ok +test model_eval::tests::parses_safe_defaults_and_overrides ... ok +test model_eval::tests::rejects_unbounded_or_invalid_limits ... ok +test model_eval::tests::repeated_prompts_form_one_ordered_conversation ... ok +test model_eval::tests::warmup_timing_separates_loading_without_inventing_missing_durations ... ok +test model_eval::tests::worker_progress_events_advance_the_watchdog ... ok +test native_edit::tests::edit_history_supports_undo_and_redo ... ok +test native_edit::tests::paste_replays_a_complete_command_shortcut ... ok +test native_media::tests::media_player_only_accepts_remote_http_urls ... ok +test native_menu::tests::edit_items_are_custom_menu_events ... ok +test native_menu::tests::user_guide_uses_unmodified_f1 ... ok +test native_menu::tests::view_items_keep_the_selected_pane_checked ... ok +test runtime::tests::dropping_active_generation_cancels_it ... ok +test runtime::tests::operation_failures_use_the_matching_event ... ok +test runtime::tests::operation_tracking_is_consistent ... ok +test runtime::tests::runtime_panic_recovery_accepts_the_next_operation ... ok +test server::request::tests::reasoning_requests_preserve_each_models_exact_modes ... ok +test server::tests::canonical_tool_replay_preserves_argument_types ... ok +test server::tests::connection_slots_enforce_the_limit_and_release_on_drop ... ok +test server::tests::content_arrays_match_ds4_text_projection ... ok +test server::tests::context_limit_errors_use_protocol_standard_fields ... ok +test server::tests::cors_headers_are_opt_in_and_cover_preflight ... ok +test server::tests::dsml_tool_stream_projects_incremental_json_arguments ... ok +test server::tests::generated_dsml_becomes_openai_tool_calls ... ok +test server::tests::generated_tool_parser_accepts_ds4_recovery_syntaxes ... ok +test server::tests::model_metadata_uses_the_requested_alias_and_default_token_limit ... ok +test server::tests::protocol_tool_results_require_live_or_replayed_call_ids ... ok +test dev_brain::tests::source_hash_drift_excludes_page_from_authoritative_queries ... ok +test server::tests::responses_parser_rejects_dropped_state_and_preserves_hosted_calls ... ok +test server::tests::sampled_tool_replay_survives_server_restart ... ok +test server::tests::streaming_errors_match_ds4_server_framing ... ok +test dev_brain::tests::verified_skills_are_indexed_and_injected_on_demand ... ok +test server::tests::tool_prompt_matches_ds4_server_text ... ok +test server::tests::tool_stream_projects_ds4_recovery_syntaxes ... ok +test settings::tests::captured_ds4_cli_options_are_uniquely_classified ... ok +test settings::tests::effective_settings_build_one_engine_and_turn_configuration ... ok +test settings::tests::effective_settings_preserve_unset_model_defaults ... ok +test settings::tests::execution_settings_keep_ds4_automatic_values_and_glm_rules ... ok +test settings::tests::kv_cache_gates_follow_the_ds4_store_rules ... ok +test settings::tests::reasoning_selection_is_exact_and_model_specific ... ok +test settings::tests::runtime_settings_preserve_automatic_values_and_cross_field_rules ... ok +test settings::tests::speculative_settings_match_acceleration_defaults_and_dependencies ... ok +test dev_brain::tests::validation_keeps_broken_links_editable_and_reports_provenance_errors ... ok +test server::tests::streaming_prefill_keeps_the_client_connection_alive ... ok +test dev_brain::tests::source_versions_follow_that_file_instead_of_the_whole_worktree ... ok +test model_eval::tests::cpu_accounting_matches_getrusage_units ... ok +test engine::validation::tests::installed_ds4_fixture_opens_and_renders_a_prompt ... ok +test model::transfer::tests::stalled_download_times_out_and_keeps_the_partial_file ... ok +test server::tests::request_deadline_stops_slow_clients ... ok +test extensions::tests::direct_hook_runner_isolated_environment_and_handles_failures ... ok +test engine::sampling_tests::ds4_sampler_matches_original_reference_tokens_and_rng ... ok +test agent::tests::execution_failures_and_timeouts_have_distinct_codes ... ok +kill: 91003: No such process +test agent::tests::dropping_session_tools_stops_live_jobs_and_removes_output ... ok +test agent::tests::local_file_and_bash_tools_execute_in_the_project ... ok +test engine::qwen_vision::qwen_image_preprocessing_matches_pillow_mtplx ... ok +test extensions::tests::lifecycle_matchers_preserve_declared_event_order ... ok +test engine::metal::qwen_mtplx_tests::mtplx_runtime_shaders_are_pinned ... ok +test extensions::tests::hook_failures_are_bounded_actionable_and_non_shell ... ok +test engine::metal::qwen_mtplx::sampling::mtplx_sampler_mixed_distributions_match_reference ... ok + +test result: ok. 312 passed; 0 failed; 234 ignored; 0 measured; 0 filtered out; finished in 5.76s + + Running unittests tools/qwen38-artifacts.rs (target/debug/deps/qwen38_artifacts-1288d410762a1a77) + +running 4 tests +test tests::artifact_names_cannot_escape_the_output_directory ... ok +test tests::affine_sample_digest_uses_packed_values_scales_and_biases ... ok +test tests::safetensors_validation_rejects_duplicate_names_and_invalid_ranges ... ok +test tests::artifact_download_resumes_an_authenticated_partial ... ok + +test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s + + Running unittests tools/test-supervisor.rs (target/debug/deps/test_supervisor-df80f419c8443a12) + +running 4 tests +test supervisor::tests::direct_worker_arguments_are_not_rust_test_arguments ... ok +test supervisor::tests::split_records_cannot_be_interleaved_with_watchdog_samples ... ok +test supervisor::tests::split_probe_records_do_not_reset_progress ... ok +ready{"event":"gpu_canary_sample","ok":true} +{"event":"gpu_canary_sample","ok":true} +{"event":"gpu_canary_sample","ok":true} +{"event":"gpu_canary_sample","ok":true} +{"event":"gpu_canary_sample","ok":true} +{"event":"gpu_canary_sample","ok":true} +ready +{"event":"gpu_canary_sample","ok":true} +{"event":"gpu_canary_sample","ok":true} +{"event":"gpu_canary_sample","ok":true} +{"event":"gpu_canary_sample","ok":true} +{"event":"gpu_canary_sample","ok":true} +{"event":"gpu_canary_sample","ok":true} +progressprogressprogressprogressprogressprogressprogressprogresstest supervisor::tests::watchdog_stops_memory_and_silence_but_not_total_runtime ... ok + +test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.38s diff --git a/metal/MLX-LICENSE.txt b/metal/MLX-LICENSE.txt new file mode 100644 index 0000000..98ff47b --- /dev/null +++ b/metal/MLX-LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright © 2023 Apple Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/metal/mtplx-moe-sorted-body.metal b/metal/mtplx-moe-sorted-body.metal new file mode 100644 index 0000000..143d39d --- /dev/null +++ b/metal/mtplx-moe-sorted-body.metal @@ -0,0 +1,199 @@ +// MTPLX 9882703, MIT; see MTPLX-LICENSE.txt. + + constexpr int BM = 64; + constexpr int BN = 64; + constexpr int BK = 64; + constexpr int WN = 2; + constexpr short SM = 32; + constexpr short SN = 32; + constexpr short SK = 32; + constexpr short TM = SM / 16; + constexpr short TN = SN / 16; + constexpr short TK = SK / 16; + constexpr int PACK = get_pack_factor(); + constexpr int PACK_BYTES = get_bytes_per_pack(); + constexpr int BK_PAD = BK + 16 / sizeof(T); + constexpr int ROW_BYTES = KD * PACK_BYTES / PACK; + constexpr int ROW_GROUPS = KD / GS; + constexpr int OUT_COLS = OUTC; + // SWIGLU: the tile's first 32 weight rows are gate rows, the last 32 the + // matching up rows, each half loaded by 64 threads from its own row range. + using WeightLoader = metal::conditional_t< + SWIGLU, + QuantizedBlockLoader, + QuantizedBlockLoader>; + + threadgroup T w_tile[BN * BK_PAD]; + + // The tile this threadgroup owns, and the one expert whose rows it holds: + // the last expert whose first tile is at or before it. + const int tile = int(threadgroup_position_in_grid.y); + if (tile >= tile_start[ED]) { + return; + } + int lo = 0; + int hi = ED - 1; + while (lo < hi) { + const int mid = (lo + hi + 1) >> 1; + if (tile_start[mid] <= tile) { + lo = mid; + } else { + hi = mid - 1; + } + } + const int expert = lo; + const int row0 = row_start[expert] + (tile - tile_start[expert]) * BM; + const int tile_rows = min(BM, row_start[expert + 1] - row0); + const int col0 = int(threadgroup_position_in_grid.x) * BN; + + const ushort sg = ushort(simdgroup_index_in_threadgroup); + const ushort lane = ushort(thread_index_in_simdgroup); + const short tm = SM * short(sg / WN); + const short tn = SN * short(sg % WN); + // Rows of this tile that fall in this simdgroup's 32-row half (0 to 32). + const short rows = short(clamp(tile_rows - int(tm), 0, int(SM))); + + ushort load_sg = sg; + const device uint8_t* w_src = (const device uint8_t*)w; + const device T* s_src = scales; + const device T* b_src = biases; + size_t w_row = size_t(expert) * ND + size_t(col0); + threadgroup T* w_dst = w_tile; + if (SWIGLU) { + // Output columns [col0 / 2, col0 / 2 + 32): the matching gate rows + // of w and up rows of wu (the same array at an offset when the + // weight is a fused [gate | up]). + const int up_half = int(load_sg / 2); + const size_t c = size_t(col0 / 2); + if (up_half) { + w_src = (const device uint8_t*)wu; + s_src = scales_u; + b_src = biases_u; + w_row = size_t(expert) * UD + size_t(UOFF) + c; + } else { + w_row = size_t(expert) * ND + c; + } + w_dst = w_tile + up_half * (BN / 2) * BK_PAD; + load_sg = load_sg % 2; + } + thread WeightLoader loader( + w_src + w_row * ROW_BYTES, + s_src + w_row * ROW_GROUPS, + b_src + w_row * ROW_GROUPS, + KD, + w_dst, + load_sg, + lane); + + NAXTile acc; + acc.clear(); + + // A lane holds rows (y, y + 8) and four consecutive columns from x of every + // 16x16 fragment (MLX's fragment coordinates). Its four token rows are + // fixed for the whole K loop; rows past the tile read as zero, as MLX's + // bounded load does. + const short2 coord = BaseNAXFrag::get_coord(); + const device T* lane_rows[TM][2]; + bool lane_live[TM][2]; + for (short i = 0; i < TM; i++) { + for (short r = 0; r < 2; r++) { + const short local = i * 16 + coord.y + r * 8; + lane_live[i][r] = local < rows; + const int token = lane_live[i][r] ? int(row_map[row0 + tm + local]) : 0; + lane_rows[i][r] = x + size_t(token) * KD + coord.x; + } + } + + // The K loop, compiled twice: for a simdgroup whose 32 rows are all live + // (no bounds) and for a partial or empty half. + dispatch_bool(rows == SM, [&](auto full) { + for (int k = 0; k < KD / BK; k++) { + threadgroup_barrier(mem_flags::mem_threadgroup); + loader.load_unsafe(); + threadgroup_barrier(mem_flags::mem_threadgroup); + + STEEL_PRAGMA_NO_UNROLL + for (short kk = 0; kk < BK; kk += SK) { + if (decltype(full)::value || rows > 0) { + NAXTile a; + NAXTile b; + volatile int keep_order; + const int col = k * BK + kk; + STEEL_PRAGMA_UNROLL + for (short i = 0; i < TM; i++) { + STEEL_PRAGMA_UNROLL + for (short j = 0; j < TK; j++) { + thread auto& frag = a.frag_at(i, j); + STEEL_PRAGMA_UNROLL + for (short r = 0; r < 2; r++) { + const device T* src = lane_rows[i][r] + col + j * 16; + STEEL_PRAGMA_UNROLL + for (short c = 0; c < 4; c++) { + if constexpr (decltype(full)::value) { + frag[r * 4 + c] = src[c]; + } else { + frag[r * 4 + c] = lane_live[i][r] ? src[c] : T(0); + } + } + } + } + } + b.template load(w_tile + tn * BK_PAD + kk); + tile_matmad_nax( + acc, + a, + metal::bool_constant{}, + b, + metal::bool_constant{}); + (void)keep_order; + } + } + loader.next(); + } + }); + + if constexpr (SWIGLU) { + // The up simdgroup of each 32-row half hands its values, rounded to T + // as the stock gather's output is, to the gate simdgroup of the same + // rows through the (now free) weight tile, lane to lane. The gate + // simdgroup writes silu(gate) * up with MLX's own functors, rounding to + // T after each op as the stock chain does. + constexpr short VALS = TM * TN * 8; + static_assert(2 * 32 * VALS <= BN * BK_PAD, "the hand-off must fit the weight tile"); + threadgroup T* handoff = w_tile + (sg / 2) * (32 * VALS) + lane * VALS; + const thread float* vals = acc.elems(); + threadgroup_barrier(mem_flags::mem_threadgroup); + if (tn != 0) { + for (short e = 0; e < VALS; e++) { + handoff[e] = static_cast(vals[e]); + } + } + threadgroup_barrier(mem_flags::mem_threadgroup); + if (tn == 0 && rows > 0) { + device T* out = y + size_t(row0 + tm) * OUT_COLS + size_t(col0 / 2); + for (short i = 0; i < TM; i++) { + for (short j = 0; j < TN; j++) { + for (short r = 0; r < 2; r++) { + const short row = i * 16 + coord.y + r * 8; + if (row >= rows) { + continue; + } + for (short c = 0; c < 4; c++) { + const short e = (i * TN + j) * 8 + r * 4 + c; + const T gate = static_cast(vals[e]); + const T act = Multiply()(gate, Sigmoid()(gate)); + out[size_t(row) * OUT_COLS + j * 16 + coord.x + c] = + Multiply()(act, handoff[e]); + } + } + } + } + } + } else if (rows > 0) { + device T* out = y + size_t(row0 + tm) * ND + size_t(col0 + tn); + if (rows == SM) { + acc.store(out, ND); + } else { + acc.store_safe(out, ND, short2(SN, rows)); + } + } diff --git a/metal/mtplx-moe-sorted-header.metal b/metal/mtplx-moe-sorted-header.metal new file mode 100644 index 0000000..a8eaaee --- /dev/null +++ b/metal/mtplx-moe-sorted-header.metal @@ -0,0 +1,4410 @@ +// MLX 0.32.2 GPU support, Copyright Apple Inc., MIT; see MLX-LICENSE.txt. +// Flattened only the GPU header closure used by MTPLX 9882703 row-map gather. +// Copyright © 2023-2024 Apple Inc. + + +#include + +// Copyright © 2023 Apple Inc. + + +#include + +using namespace metal; + +typedef bfloat bfloat16_t; +inline uint16_t bfloat16_to_uint16(const bfloat16_t x) { + return as_type(x); +} + +inline bfloat16_t uint16_to_bfloat16(const uint16_t x) { + return as_type(x); +} +// Copyright © 2023 Apple Inc. + + +/////////////////////////////////////////////////////////////////////////////// +// Metal math for bfloat16 +/////////////////////////////////////////////////////////////////////////////// + +/* + +Following the Metal Shading Language Specification (Metal 3.1) + +"bfloat is an extended itypeing point type that only allows implicit conversion + to a type of greater itypeing point rank. While bfloat can be implicitly + converted to itype, it cannot be implicitly converted to half, and neither + itype nor half can be implicitly converted to bfloat." + +Further, as far as I can tell, the stdlib math/simd functions are not defined +for bfloat and calling with an argument of type bfloat will result in that +argument getting implicitly converted to itype which then returns an output +that is (likely) a itype which cannot be implicitly converted into a bfloat + +This leads to situations where +bfloat a = 5.0bf; +bfloat b = metal::abs(a); // this will throw an error since abs return itype +bfloat c = static_cast(metal::abs(a)); // this is fine + +For the moment, I will be adding overloaded instantiations of the math +functions to accordingly automatically handle the casting + +*/ + +#define instantiate_metal_math_funcs(itype, otype, ctype, mfast) \ + \ + METAL_FUNC otype abs(itype x) { \ + return static_cast(__metal_fabs(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype acos(itype x) { \ + return static_cast(__metal_acos(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype acosh(itype x) { \ + return static_cast(__metal_acosh(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype asin(itype x) { \ + return static_cast(__metal_asin(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype asinh(itype x) { \ + return static_cast(__metal_asinh(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype atan(itype y_over_x) { \ + return static_cast( \ + __metal_atan(static_cast(y_over_x), mfast)); \ + } \ + METAL_FUNC otype atan2(itype y, itype x) { \ + return static_cast( \ + __metal_atan2(static_cast(y), static_cast(x), mfast)); \ + } \ + METAL_FUNC otype atanh(itype x) { \ + return static_cast(__metal_atanh(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype ceil(itype x) { \ + return static_cast(__metal_ceil(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype cos(itype x) { \ + return static_cast(__metal_cos(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype cosh(itype x) { \ + return static_cast(__metal_cosh(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype cospi(itype x) { \ + return static_cast(__metal_cospi(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype divide(itype x, itype y) { \ + return static_cast( \ + __metal_divide(static_cast(x), static_cast(y), mfast)); \ + } \ + METAL_FUNC otype exp(itype x) { \ + return static_cast(__metal_exp(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype exp10(itype x) { \ + return static_cast(__metal_exp10(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype exp2(itype x) { \ + return static_cast(__metal_exp2(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype fabs(itype x) { \ + return static_cast(__metal_fabs(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype fdim(itype x, itype y) { \ + ctype t = static_cast(x - y); \ + return static_cast(select(t, ctype(0), t < ctype(0) || x == y)); \ + } \ + METAL_FUNC otype floor(itype x) { \ + return static_cast(__metal_floor(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype fma(itype x, itype y, itype z) { \ + return static_cast(__metal_fma( \ + static_cast(x), static_cast(y), static_cast(z))); \ + } \ + METAL_FUNC otype fmax(itype x, itype y) { \ + return static_cast( \ + __metal_fmax(static_cast(x), static_cast(y), mfast)); \ + } \ + METAL_FUNC otype fmax3(itype x, itype y, itype z) { \ + return static_cast(__metal_fmax3( \ + static_cast(x), \ + static_cast(y), \ + static_cast(z), \ + mfast)); \ + } \ + METAL_FUNC otype fmedian3(itype x, itype y, itype z) { \ + return static_cast(__metal_fmedian3( \ + static_cast(x), \ + static_cast(y), \ + static_cast(z), \ + mfast)); \ + } \ + METAL_FUNC otype fmin(itype x, itype y) { \ + return static_cast( \ + __metal_fmin(static_cast(x), static_cast(y), mfast)); \ + } \ + METAL_FUNC otype fmin3(itype x, itype y, itype z) { \ + return static_cast(__metal_fmin3( \ + static_cast(x), \ + static_cast(y), \ + static_cast(z), \ + mfast)); \ + } \ + METAL_FUNC otype fmod(itype x, itype y) { \ + return static_cast( \ + __metal_fmod(static_cast(x), static_cast(y), mfast)); \ + } \ + METAL_FUNC otype fract(itype x) { \ + return static_cast(__metal_fract(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype frexp(itype x, thread int& exp) { \ + return static_cast(__metal_frexp(static_cast(x), &exp)); \ + } \ + METAL_FUNC otype ldexp(itype x, int k) { \ + return static_cast(__metal_ldexp(static_cast(x), k, mfast)); \ + } \ + METAL_FUNC otype log(itype x) { \ + return static_cast(__metal_log(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype log10(itype x) { \ + return static_cast(__metal_log10(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype log2(itype x) { \ + return static_cast(__metal_log2(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype max(itype x, itype y) { \ + return static_cast( \ + __metal_fmax(static_cast(x), static_cast(y), mfast)); \ + } \ + METAL_FUNC otype max3(itype x, itype y, itype z) { \ + return static_cast(__metal_fmax3( \ + static_cast(x), \ + static_cast(y), \ + static_cast(z), \ + mfast)); \ + } \ + METAL_FUNC otype median3(itype x, itype y, itype z) { \ + return static_cast(__metal_fmedian3( \ + static_cast(x), \ + static_cast(y), \ + static_cast(z), \ + mfast)); \ + } \ + METAL_FUNC otype min(itype x, itype y) { \ + return static_cast( \ + __metal_fmin(static_cast(x), static_cast(y), mfast)); \ + } \ + METAL_FUNC otype min3(itype x, itype y, itype z) { \ + return static_cast(__metal_fmin3( \ + static_cast(x), \ + static_cast(y), \ + static_cast(z), \ + mfast)); \ + } \ + METAL_FUNC otype nextafter(itype x, itype y) { \ + return static_cast( \ + __metal_nextafter(static_cast(x), static_cast(y))); \ + } \ + METAL_FUNC otype pow(itype x, itype y) { \ + return static_cast( \ + __metal_pow(static_cast(x), static_cast(y), mfast)); \ + } \ + METAL_FUNC otype powr(itype x, itype y) { \ + return static_cast( \ + __metal_powr(static_cast(x), static_cast(y), mfast)); \ + } \ + METAL_FUNC otype rint(itype x) { \ + return static_cast(__metal_rint(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype round(itype x) { \ + return static_cast(__metal_round(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype rsqrt(itype x) { \ + return static_cast(__metal_rsqrt(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype sin(itype x) { \ + return static_cast(__metal_sin(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype sinh(itype x) { \ + return static_cast(__metal_sinh(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype sinpi(itype x) { \ + return static_cast(__metal_sinpi(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype sqrt(itype x) { \ + return static_cast(__metal_sqrt(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype tan(itype x) { \ + return static_cast(__metal_tan(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype tanh(itype x) { \ + return static_cast(__metal_tanh(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype tanpi(itype x) { \ + return static_cast(__metal_tanpi(static_cast(x), mfast)); \ + } \ + METAL_FUNC otype trunc(itype x) { \ + return static_cast(__metal_trunc(static_cast(x), mfast)); \ + } + +namespace metal { + +instantiate_metal_math_funcs( + bfloat16_t, + bfloat16_t, + float, + __METAL_MAYBE_FAST_MATH__); + +namespace fast { + +instantiate_metal_math_funcs( + bfloat16_t, + bfloat16_t, + float, + __METAL_FAST_MATH__); + +} // namespace fast + +namespace precise { + +instantiate_metal_math_funcs( + bfloat16_t, + bfloat16_t, + float, + __METAL_PRECISE_MATH__); + +} // namespace precise + +} // namespace metal + +/////////////////////////////////////////////////////////////////////////////// +// Metal simd for bfloat16 +/////////////////////////////////////////////////////////////////////////////// + +#define instantiate_metal_simd_comm_funcs( \ + itype, otype, ctype, itype_to_ctype, ctype_to_otype) \ + \ + METAL_FUNC otype simd_broadcast(itype data, ushort broadcast_lane_id) { \ + return ctype_to_otype( \ + __metal_simd_broadcast(itype_to_ctype(data), broadcast_lane_id)); \ + } \ + \ + METAL_FUNC otype simd_shuffle(itype data, ushort simd_lane_id) { \ + return ctype_to_otype( \ + __metal_simd_shuffle(itype_to_ctype(data), simd_lane_id)); \ + } \ + \ + METAL_FUNC otype simd_shuffle_and_fill_down( \ + itype data, itype filling_data, ushort delta, ushort modulo) { \ + return ctype_to_otype(__metal_simd_shuffle_and_fill_down( \ + itype_to_ctype(data), itype_to_ctype(filling_data), delta, modulo)); \ + } \ + \ + METAL_FUNC otype simd_shuffle_and_fill_down( \ + itype data, itype filling_data, ushort delta) { \ + return ctype_to_otype(__metal_simd_shuffle_and_fill_down( \ + itype_to_ctype(data), \ + itype_to_ctype(filling_data), \ + delta, \ + __metal_get_simdgroup_size(ushort()))); \ + } \ + \ + METAL_FUNC otype simd_shuffle_and_fill_up( \ + itype data, itype filling_data, ushort delta, ushort modulo) { \ + return ctype_to_otype(__metal_simd_shuffle_and_fill_up( \ + itype_to_ctype(data), itype_to_ctype(filling_data), delta, modulo)); \ + } \ + \ + METAL_FUNC otype simd_shuffle_and_fill_up( \ + itype data, itype filling_data, ushort delta) { \ + return ctype_to_otype(__metal_simd_shuffle_and_fill_up( \ + itype_to_ctype(data), \ + itype_to_ctype(filling_data), \ + delta, \ + __metal_get_simdgroup_size(ushort()))); \ + } \ + \ + METAL_FUNC otype simd_shuffle_down(itype data, ushort delta) { \ + return ctype_to_otype( \ + __metal_simd_shuffle_down(itype_to_ctype(data), delta)); \ + } \ + \ + METAL_FUNC otype simd_shuffle_rotate_down(itype data, ushort delta) { \ + return ctype_to_otype( \ + __metal_simd_shuffle_rotate_down(itype_to_ctype(data), delta)); \ + } \ + \ + METAL_FUNC otype simd_shuffle_rotate_up(itype data, ushort delta) { \ + return ctype_to_otype( \ + __metal_simd_shuffle_rotate_up(itype_to_ctype(data), delta)); \ + } \ + \ + METAL_FUNC otype simd_shuffle_up(itype data, ushort delta) { \ + return ctype_to_otype( \ + __metal_simd_shuffle_up(itype_to_ctype(data), delta)); \ + } \ + \ + METAL_FUNC otype simd_shuffle_xor(itype data, ushort mask) { \ + return ctype_to_otype( \ + __metal_simd_shuffle_xor(itype_to_ctype(data), mask)); \ + } + +#define instantiate_metal_simd_reduction_funcs(itype, otype, ctype) \ + \ + METAL_FUNC otype simd_max(itype data) { \ + return static_cast(__metal_simd_max(static_cast(data))); \ + } \ + \ + METAL_FUNC otype simd_min(itype data) { \ + return static_cast(__metal_simd_min(static_cast(data))); \ + } \ + \ + METAL_FUNC otype simd_prefix_exclusive_product(itype data) { \ + return static_cast( \ + __metal_simd_prefix_exclusive_product(static_cast(data))); \ + } \ + \ + METAL_FUNC otype simd_prefix_exclusive_sum(itype data) { \ + return static_cast( \ + __metal_simd_prefix_exclusive_sum(static_cast(data))); \ + } \ + \ + METAL_FUNC otype simd_prefix_inclusive_product(itype data) { \ + return static_cast( \ + __metal_simd_prefix_inclusive_product(static_cast(data))); \ + } \ + \ + METAL_FUNC otype simd_prefix_inclusive_sum(itype data) { \ + return static_cast( \ + __metal_simd_prefix_inclusive_sum(static_cast(data))); \ + } \ + \ + METAL_FUNC otype simd_product(itype data) { \ + return static_cast(__metal_simd_product(static_cast(data))); \ + } \ + \ + METAL_FUNC otype simd_sum(itype data) { \ + return static_cast(__metal_simd_sum(static_cast(data))); \ + } \ + \ + METAL_FUNC otype simd_xor(itype data) { \ + return static_cast(__metal_simd_xor(static_cast(data))); \ + } + +namespace metal { + +instantiate_metal_simd_comm_funcs( + bfloat16_t, + bfloat16_t, + uint16_t, + bfloat16_to_uint16, + uint16_to_bfloat16); +instantiate_metal_simd_reduction_funcs(bfloat16_t, bfloat16_t, float); + +} // namespace metal +// Copyright © 2023 Apple Inc. + + +#include + + +using namespace metal; + +template +struct complex_t; + +template +static constexpr constant bool is_complex_v = false; + +template +static constexpr constant bool is_complex_v> = true; + +// Metal accepts explicit bfloat casts that is_convertible_v reports as false. +template +static constexpr constant bool is_lane_convertible_v = + is_convertible_v || + (is_same_v && is_convertible_v) || + (is_same_v && is_convertible_v); + +template +struct complex_t { + using value_type = T; + + T real; + T imag; + + // Constructors + constexpr complex_t(T real, T imag) thread : real(real), imag(imag) {}; + constexpr complex_t() thread : real(0), imag(0) {}; + constexpr complex_t() threadgroup : real(0), imag(0) {}; + + // Conversions from scalar types + template < + typename U, + typename = typename enable_if< + !is_complex_v && is_lane_convertible_v>::type> + constexpr complex_t(U x) thread : real(static_cast(x)), + imag(static_cast(0)) {} + + template < + typename U, + typename = typename enable_if< + !is_complex_v && is_lane_convertible_v>::type> + constexpr complex_t(U x) threadgroup : real(static_cast(x)), + imag(static_cast(0)) {} + + template < + typename U, + typename = typename enable_if< + !is_complex_v && is_lane_convertible_v>::type> + constexpr complex_t(U x) device : real(static_cast(x)), + imag(static_cast(0)) {} + + template < + typename U, + typename = typename enable_if< + !is_complex_v && is_lane_convertible_v>::type> + constexpr complex_t(U x) constant : real(static_cast(x)), + imag(static_cast(0)) {} + + // Conversions between complex types + template < + typename U, + typename = typename enable_if< + !is_same_v && is_lane_convertible_v>::type> + constexpr complex_t(complex_t x) thread : real(static_cast(x.real)), + imag(static_cast(x.imag)) {} + + template < + typename U, + typename = typename enable_if< + !is_same_v && is_lane_convertible_v>::type> + constexpr complex_t(complex_t x) threadgroup + : real(static_cast(x.real)), + imag(static_cast(x.imag)) {} + + template < + typename U, + typename = typename enable_if< + !is_same_v && is_lane_convertible_v>::type> + constexpr complex_t(complex_t x) device : real(static_cast(x.real)), + imag(static_cast(x.imag)) {} + + template < + typename U, + typename = typename enable_if< + !is_same_v && is_lane_convertible_v>::type> + constexpr complex_t(complex_t x) constant : real(static_cast(x.real)), + imag(static_cast(x.imag)) {} + + // Conversions to and from two-lane vectors (the FFT lane representation) + constexpr complex_t(vec v) thread : real(v.x), imag(v.y) {}; + constexpr complex_t(vec v) threadgroup : real(v.x), imag(v.y) {}; + constexpr complex_t(vec v) device : real(v.x), imag(v.y) {}; + constexpr complex_t(vec v) constant : real(v.x), imag(v.y) {}; + + constexpr operator vec() const thread { + return vec(real, imag); + } + + constexpr operator vec() const threadgroup { + return vec(real, imag); + } + + constexpr operator vec() const device { + return vec(real, imag); + } + + constexpr operator vec() const constant { + return vec(real, imag); + } + + // Conversions to scalar types + template < + typename U, + typename = typename enable_if< + !is_complex_v && is_lane_convertible_v>::type> + constexpr operator U() const thread { + return static_cast(real); + } + + template < + typename U, + typename = typename enable_if< + !is_complex_v && is_lane_convertible_v>::type> + constexpr operator U() const threadgroup { + return static_cast(real); + } + + template < + typename U, + typename = typename enable_if< + !is_complex_v && is_lane_convertible_v>::type> + constexpr operator U() const device { + return static_cast(real); + } + + template < + typename U, + typename = typename enable_if< + !is_complex_v && is_lane_convertible_v>::type> + constexpr operator U() const constant { + return static_cast(real); + } +}; + +using complex32_t = complex_t; +using complex64_t = complex_t; + +static_assert(sizeof(complex32_t) == 2 * sizeof(half)); +static_assert(sizeof(complex64_t) == 2 * sizeof(float)); +static_assert(sizeof(complex_t) == 2 * sizeof(bfloat16_t)); + +template +constexpr complex_t operator-(complex_t x) { + return {-x.real, -x.imag}; +} + +template +constexpr bool operator>=(complex_t a, complex_t b) { + return (a.real > b.real) || (a.real == b.real && a.imag >= b.imag); +} + +template +constexpr bool operator>(complex_t a, complex_t b) { + return (a.real > b.real) || (a.real == b.real && a.imag > b.imag); +} + +template +constexpr bool operator<=(complex_t a, complex_t b) { + return operator>=(b, a); +} + +template +constexpr bool operator<(complex_t a, complex_t b) { + return operator>(b, a); +} + +template +constexpr bool operator==(complex_t a, complex_t b) { + return a.real == b.real && a.imag == b.imag; +} + +template +constexpr complex_t operator+(complex_t a, complex_t b) { + return {a.real + b.real, a.imag + b.imag}; +} + +template +constexpr thread complex_t& operator+=( + thread complex_t& a, + complex_t b) { + a.real += b.real; + a.imag += b.imag; + return a; +} + +template +constexpr threadgroup complex_t& operator+=( + threadgroup complex_t& a, + complex_t b) { + a.real += b.real; + a.imag += b.imag; + return a; +} + +template +constexpr device complex_t& operator+=( + device complex_t& a, + complex_t b) { + a.real += b.real; + a.imag += b.imag; + return a; +} + +template < + typename T, + typename U, + enable_if_t && is_lane_convertible_v, bool> = true> +constexpr complex_t operator+(U a, complex_t b) { + return {static_cast(a) + b.real, b.imag}; +} + +template < + typename T, + typename U, + enable_if_t && is_lane_convertible_v, bool> = true> +constexpr complex_t operator+(complex_t a, U b) { + return {a.real + static_cast(b), a.imag}; +} + +template +constexpr complex_t operator-(complex_t a, complex_t b) { + return {a.real - b.real, a.imag - b.imag}; +} + +template < + typename T, + typename U, + enable_if_t && is_lane_convertible_v, bool> = true> +constexpr complex_t operator-(U a, complex_t b) { + return {static_cast(a) - b.real, -b.imag}; +} + +template < + typename T, + typename U, + enable_if_t && is_lane_convertible_v, bool> = true> +constexpr complex_t operator-(complex_t a, U b) { + return {a.real - static_cast(b), a.imag}; +} + +template +constexpr complex_t operator*(complex_t a, complex_t b) { + return {a.real * b.real - a.imag * b.imag, a.real * b.imag + a.imag * b.real}; +} + +template +constexpr complex_t operator/(complex_t a, complex_t b) { + auto denom = b.real * b.real + b.imag * b.imag; + auto x = a.real * b.real + a.imag * b.imag; + auto y = a.imag * b.real - a.real * b.imag; + return {x / denom, y / denom}; +} + +template < + typename T, + typename U, + enable_if_t && is_lane_convertible_v, bool> = true> +constexpr complex_t operator/(U a, complex_t b) { + auto scalar = static_cast(a); + auto denom = b.real * b.real + b.imag * b.imag; + auto x = scalar * b.real; + auto y = -scalar * b.imag; + return {x / denom, y / denom}; +} + +template +constexpr complex_t operator%(complex_t a, complex_t b) { + auto real = a.real - (b.real * static_cast(a.real / b.real)); + auto imag = a.imag - (b.imag * static_cast(a.imag / b.imag)); + if (real != 0 && (real < 0 != b.real < 0)) { + real += b.real; + } + if (imag != 0 && (imag < 0 != b.imag < 0)) { + imag += b.imag; + } + return {real, imag}; +} + +static_assert( + (complex_t{1.0h, 2.0h} * complex_t{3.0h, 4.0h}).real == -5.0h); +static_assert( + (complex_t{bfloat16_t(1.0f), bfloat16_t(2.0f)} * + complex_t{bfloat16_t(3.0f), bfloat16_t(4.0f)}) + .real == bfloat16_t(-5.0f)); +// Copyright © 2023 Apple Inc. + + +#if defined __METAL__ || defined MLX_METAL_JIT +#define MTL_CONST constant +#else +#define MTL_CONST +#endif + +static MTL_CONST constexpr int MAX_REDUCE_SPECIALIZED_DIMS = 4; +static MTL_CONST constexpr int REDUCE_N_READS = 4; +static MTL_CONST constexpr int REDUCE_N_WRITES = 4; +static MTL_CONST constexpr int SOFTMAX_N_READS = 4; +static MTL_CONST constexpr int RMS_N_READS = 4; +static MTL_CONST constexpr int RMS_LOOPED_LIMIT = 4096; + +// Instantiate a templated kernel. +// Extra args are used as template parameters: +// e.g. instantiate_kernel(binary_int, binary, a, b) -> +// [[host_name(binary_int)]] [kernel] binary +#define instantiate_kernel(name, func, ...) \ + template [[host_name( \ + name)]] [[kernel]] decltype(func<__VA_ARGS__>) func<__VA_ARGS__>; +// Copyright © 2025 Apple Inc. + + +#if defined(__METAL_VERSION__) && (__METAL_VERSION__ >= 320) +#include + +namespace mlx { +using os_log = metal::os_log; +} // namespace mlx + +#else + +namespace mlx { +struct os_log { + constexpr os_log(constant char*, constant char*) constant {} + + template + void log_debug(constant char*, Args...) const thread {} + + template + void log_debug(constant char*, Args...) const constant {} +}; +} // namespace mlx + +#endif + +typedef half float16_t; + +// Work per thread values for different types. The values here are expected to +// match get_work_per_thread in mlx/backend/metal/utils.h +template +struct WorkPerThread { + static_assert(sizeof(U) <= 8, "Type too large"); + static constexpr int constant n = 8 / sizeof(U); +}; + +/////////////////////////////////////////////////////////////////////////////// +// Type limits utils +/////////////////////////////////////////////////////////////////////////////// + +template +struct Limits { + static const constant U max = metal::numeric_limits::max(); + static const constant U min = metal::numeric_limits::min(); + static const constant U finite_max = metal::numeric_limits::max(); + static const constant U finite_min = metal::numeric_limits::min(); +}; + +#define instantiate_default_limit(type) \ + template <> \ + struct Limits { \ + static constexpr constant type max = metal::numeric_limits::max(); \ + static constexpr constant type min = metal::numeric_limits::min(); \ + static constexpr constant type finite_max = \ + metal::numeric_limits::max(); \ + static constexpr constant type finite_min = \ + metal::numeric_limits::min(); \ + }; + +instantiate_default_limit(uint8_t); +instantiate_default_limit(uint16_t); +instantiate_default_limit(uint32_t); +instantiate_default_limit(uint64_t); +instantiate_default_limit(int8_t); +instantiate_default_limit(int16_t); +instantiate_default_limit(int32_t); +instantiate_default_limit(int64_t); + +#define instantiate_float_limit(type) \ + template <> \ + struct Limits { \ + static constexpr constant type max = \ + metal::numeric_limits::infinity(); \ + static constexpr constant type min = \ + -metal::numeric_limits::infinity(); \ + static constexpr constant type finite_max = \ + metal::numeric_limits::max(); \ + static constexpr constant type finite_min = \ + -metal::numeric_limits::max(); \ + }; + +instantiate_float_limit(half); +instantiate_float_limit(float); +instantiate_float_limit(bfloat16_t); + +template <> +struct Limits { + static constexpr constant bool max = true; + static constexpr constant bool min = false; +}; + +template +struct Limits> { + inline static constexpr constant complex_t max = complex_t( + metal::numeric_limits::infinity(), + metal::numeric_limits::infinity()); + inline static constexpr constant complex_t min = complex_t( + -metal::numeric_limits::infinity(), + -metal::numeric_limits::infinity()); +}; + +/////////////////////////////////////////////////////////////////////////////// +// Indexing utils +/////////////////////////////////////////////////////////////////////////////// + +#define MLX_MTL_PRAGMA_UNROLL _Pragma("clang loop unroll(full)") + +/////////////////////////////////////////////////////////////////////////////// +// Single Array with generic dims + +template +METAL_FUNC IdxT elem_to_loc( + IdxT elem, + constant const int* shape, + constant const int64_t* strides, + int ndim) { + IdxT loc = 0; + for (int i = ndim - 1; i >= 0 && elem > 0; --i) { + loc += (elem % shape[i]) * IdxT(strides[i]); + elem /= shape[i]; + } + return loc; +} + +// Non templated version to handle arbitrary dims +template +METAL_FUNC IdxT elem_to_loc( + uint3 elem, + constant const int* shape, + constant const int64_t* strides, + int ndim) { + IdxT loc = + elem.x * IdxT(strides[ndim - 1]) + elem.y * IdxT(strides[ndim - 2]); + for (int d = ndim - 3; d >= 0; --d) { + loc += (elem.z % shape[d]) * IdxT(strides[d]); + elem.z /= shape[d]; + } + return loc; +} + +/////////////////////////////////////////////////////////////////////////////// +// Single Array with fixed N dims + +template +METAL_FUNC IdxT elem_to_loc_1(uint elem, constant const int64_t& stride) { + return elem * IdxT(stride); +} + +template +METAL_FUNC IdxT elem_to_loc_2(uint2 elem, constant const int64_t strides[2]) { + return elem.x * IdxT(strides[1]) + elem.y * IdxT(strides[0]); +} + +template +METAL_FUNC IdxT elem_to_loc_3(uint3 elem, constant const int64_t strides[3]) { + return elem.x * IdxT(strides[2]) + elem.y * IdxT(strides[1]) + + elem.z * IdxT(strides[0]); +} + +/////////////////////////////////////////////////////////////////////////////// +// Multiple Arrays with generic dims + +template +METAL_FUNC vec elem_to_loc_2_nd( + uint3 elem, + constant const int* shape, + constant const int64_t* a_strides, + constant const int64_t* b_strides, + int ndim) { + vec loc = { + IdxT( + elem.x * IdxT(a_strides[ndim - 1]) + + IdxT(elem.y) * IdxT(a_strides[ndim - 2])), + IdxT( + elem.x * IdxT(b_strides[ndim - 1]) + + elem.y * IdxT(b_strides[ndim - 2]))}; + for (int d = ndim - 3; d >= 0; --d) { + uint l = elem.z % shape[d]; + loc.x += l * IdxT(a_strides[d]); + loc.y += l * IdxT(b_strides[d]); + elem.z /= shape[d]; + } + return loc; +} + +template +METAL_FUNC vec elem_to_loc_3_nd( + uint3 elem, + constant const int* shape, + constant const int64_t* a_strides, + constant const int64_t* b_strides, + constant const int64_t* c_strides, + int ndim) { + vec loc = { + IdxT(elem.x * IdxT(a_strides[ndim - 1])) + + IdxT(elem.y * IdxT(a_strides[ndim - 2])), + IdxT(elem.x * IdxT(b_strides[ndim - 1])) + + IdxT(elem.y * IdxT(b_strides[ndim - 2])), + IdxT(elem.x * IdxT(c_strides[ndim - 1])) + + IdxT(elem.y * IdxT(c_strides[ndim - 2]))}; + for (int d = ndim - 3; d >= 0; --d) { + uint l = elem.z % shape[d]; + loc.x += l * IdxT(a_strides[d]); + loc.y += l * IdxT(b_strides[d]); + loc.z += l * IdxT(c_strides[d]); + elem.z /= shape[d]; + } + return loc; +} + +/////////////////////////////////////////////////////////////////////////////// +// Elem to loc in a loop utils +/////////////////////////////////////////////////////////////////////////////// + +template +struct LoopedElemToLoc { + int dim; + LoopedElemToLoc inner_looper; + OffsetT offset{0}; + int index{0}; + + LoopedElemToLoc(int dim) thread : dim(dim), inner_looper(dim - 1) {} + + void next(const constant int* shape, const constant int64_t* strides) thread { + if (dim == 0) { + return; + } + index++; + offset += OffsetT(strides[dim - 1]); + if (index >= shape[dim - 1]) { + index = 0; + inner_looper.next(shape, strides); + offset = inner_looper.offset; + } + } + + void next(int n, const constant int* shape, const constant int64_t* strides) + thread { + if (dim == 0) { + return; + } + index += n; + offset += n * OffsetT(strides[dim - 1]); + + if (index >= shape[dim - 1]) { + int extra = index - shape[dim - 1]; + if (extra >= shape[dim - 1]) { + inner_looper.next(1 + extra / shape[dim - 1], shape, strides); + extra = extra % shape[dim - 1]; + } else { + inner_looper.next(shape, strides); + } + index = 0; + offset = inner_looper.offset; + if (extra > 0) { + next(extra, shape, strides); + } + } + } + + OffsetT location() thread { + return offset; + } +}; + +template +struct LoopedElemToLoc<1, OffsetT, true> { + int dim; + OffsetT offset{0}; + uint index{0}; + + LoopedElemToLoc(int dim) thread : dim(dim) {} + + void next(const constant int* shape, const constant int64_t* strides) thread { + index++; + if (dim > 1) { + offset = elem_to_loc(index, shape, strides, dim); + } else { + offset += OffsetT(strides[0]); + } + } + + void next(int n, const constant int* shape, const constant int64_t* strides) + thread { + index += n; + if (dim > 1) { + offset = elem_to_loc(index, shape, strides, dim); + } else { + offset = index * OffsetT(strides[0]); + } + } + + OffsetT location() thread { + return offset; + } +}; + +template +struct LoopedElemToLoc<1, OffsetT, false> { + OffsetT offset{0}; + + LoopedElemToLoc(int) thread {} + + void next(const constant int*, const constant int64_t* strides) thread { + offset += OffsetT(strides[0]); + } + + void next(int n, const constant int*, const constant int64_t* strides) + thread { + offset += n * OffsetT(strides[0]); + } + + OffsetT location() thread { + return offset; + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// Calculation utils +/////////////////////////////////////////////////////////////////////////////// + +/** Compute ceil((float)N/(float)M) */ +template +inline T ceildiv(T N, U M) { + return (N + M - 1) / M; +} + +// https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html#1202 +inline float log1p(float x) { + float xp1 = 1.0f + x; + if (xp1 == Limits::max) { + return Limits::max; + } + if (xp1 == 1.0f) { + return x; + } + + return x * (metal::log(xp1) / (xp1 - 1.0f)); +} + +inline bfloat16_t log1p(bfloat16_t x) { + float xp1 = 1.0f + static_cast(x); + if (xp1 == Limits::max) { + return Limits::max; + } + if (xp1 == 1.0f) { + return x; + } + + return bfloat16_t(x * (metal::log(xp1) / (xp1 - 1.0f))); +} + +inline complex64_t log1p(complex64_t in) { + float x = in.real; + float y = in.imag; + float zabs = metal::precise::sqrt(x * x + y * y); + float theta = metal::atan2(y, x + 1); + if (zabs < 0.5f) { + float r = x * (2 + x) + y * y; + if (r == 0) { // handle underflow + return {x, theta}; + } + return {0.5f * log1p(r), theta}; + } else { + auto z0 = metal::sqrt((x + 1) * (x + 1) + y * y); + return {metal::log(z0), theta}; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// SIMD shuffle ops +/////////////////////////////////////////////////////////////////////////////// + +inline uint64_t simd_shuffle_down(uint64_t data, uint16_t delta) { + return as_type( + metal::simd_shuffle_down(as_type(data), delta)); +} + +inline int64_t simd_shuffle_down(int64_t data, uint16_t delta) { + return as_type( + metal::simd_shuffle_down(as_type(data), delta)); +} + +inline bool simd_shuffle_down(bool data, uint16_t delta) { + return simd_shuffle_down(static_cast(data), delta); +} + +inline complex64_t simd_shuffle_down(complex64_t data, uint16_t delta) { + return complex64_t( + simd_shuffle_down(data.real, delta), simd_shuffle_down(data.imag, delta)); +} + +inline uint64_t simd_shuffle_up(uint64_t data, uint16_t delta) { + return as_type(metal::simd_shuffle_up(as_type(data), delta)); +} + +inline int64_t simd_shuffle_up(int64_t data, uint16_t delta) { + return as_type(metal::simd_shuffle_up(as_type(data), delta)); +} + +inline bool simd_shuffle_up(bool data, uint16_t delta) { + return simd_shuffle_up(static_cast(data), delta); +} + +inline complex64_t simd_shuffle_up(complex64_t data, uint16_t delta) { + return complex64_t( + simd_shuffle_up(data.real, delta), simd_shuffle_up(data.imag, delta)); +} + +inline uint64_t +simd_shuffle_and_fill_up(uint64_t data, uint64_t filling, uint16_t delta) { + return as_type(metal::simd_shuffle_and_fill_up( + as_type(data), as_type(filling), delta)); +} + +inline int64_t +simd_shuffle_and_fill_up(int64_t data, int64_t filling, uint16_t delta) { + return as_type(metal::simd_shuffle_and_fill_up( + as_type(data), as_type(filling), delta)); +} + +inline bool simd_shuffle_and_fill_up(bool data, bool filling, uint16_t delta) { + return simd_shuffle_and_fill_up( + static_cast(data), static_cast(filling), delta); +} + +inline complex64_t simd_shuffle_and_fill_up( + complex64_t data, + complex64_t filling, + uint16_t delta) { + return complex64_t( + simd_shuffle_and_fill_up(data.real, filling.real, delta), + simd_shuffle_and_fill_up(data.imag, filling.imag, delta)); +} + +inline uint64_t simd_shuffle(uint64_t data, uint16_t lane) { + return as_type(metal::simd_shuffle(as_type(data), lane)); +} + +inline int64_t simd_shuffle(int64_t data, uint16_t lane) { + return as_type(metal::simd_shuffle(as_type(data), lane)); +} + +inline bool simd_shuffle(bool data, uint16_t lane) { + return simd_shuffle(static_cast(data), lane); +} + +inline complex64_t simd_shuffle(complex64_t data, uint16_t lane) { + return complex64_t( + simd_shuffle(data.real, lane), simd_shuffle(data.imag, lane)); +} + +// std::conditional is not included with Metal +template +struct ConditionalType { + using type = U; +}; + +template +struct ConditionalType { + using type = T; +}; + +/////////////////////////////////////////////////////////////////////////////// +// Type casting utils +/////////////////////////////////////////////////////////////////////////////// + +template +inline U cast_to(T val) { + return static_cast(val); +} + +template <> +inline bool cast_to(float val) { + return (as_type(val) & 0x7FFFFFFF) != 0; +} + +template <> +inline bool cast_to(bfloat16_t val) { + return (as_type(val) & 0x7FFF) != 0; +} + +template <> +inline bool cast_to(complex64_t val) { + return cast_to(val.real) || cast_to(val.imag); +} +// Copyright © 2025 Apple Inc. + + +// Copyright © 2025 Apple Inc. + + +#include +#include +#include + +// Copyright © 2024 Apple Inc. + + +#define STEEL_CONST static constant constexpr const +#define STEEL_PRAGMA_UNROLL _Pragma("clang loop unroll(full)") +#define STEEL_PRAGMA_NO_UNROLL _Pragma("clang loop unroll(disable)") +// Copyright © 2024 Apple Inc. + + +#include +// Copyright © 2024 Apple Inc. + + +#include + +#pragma METAL internals : enable + +namespace metal { + +template +struct is_empty : metal::bool_constant<__is_empty(T)> {}; + +#ifdef __cpp_variable_templates +template +constexpr constant bool is_empty_v = is_empty::value; +#endif + +template +struct make_void { + typedef void type; +}; + +template +using void_t = typename make_void::type; + +template +struct is_static : metal::bool_constant>::value> {}; + +template +struct pointer_element {}; + +template +struct pointer_element { + using type = remove_cv_t; +}; +template +struct pointer_element { + using type = remove_cv_t; +}; +template +struct pointer_element { + using type = remove_cv_t; +}; +template +struct pointer_element { + using type = remove_cv_t; +}; + +template +using pointer_element_t = typename pointer_element>::type; + +} // namespace metal + +#pragma METAL internals : disable + +#pragma METAL internals : enable + +namespace mlx { +namespace steel { + +/////////////////////////////////////////////////////////////////////////////// +// Integral constant with casting +/////////////////////////////////////////////////////////////////////////////// + +template +struct integral_constant { + static constexpr constant T value = v; + using value_type = T; + using type = integral_constant; + + METAL_FUNC constexpr operator value_type() const thread noexcept { + return value; + } +}; + +template +using bool_constant = integral_constant; +using true_type = bool_constant; +using false_type = bool_constant; + +template +struct is_integral : bool_constant::value> {}; + +template +struct is_integral> + : bool_constant::value> {}; + +template +constexpr constant bool is_integral_v = is_integral::value; + +template +using Int = integral_constant; + +/////////////////////////////////////////////////////////////////////////////// +// Binary Operators on Integral constants +/////////////////////////////////////////////////////////////////////////////// + +#define integral_const_binop(__op__, __operator__) \ + template \ + METAL_FUNC constexpr auto __operator__( \ + integral_constant, integral_constant) { \ + constexpr auto res = tv __op__ uv; \ + using res_t = metal::remove_addrspace_t; \ + return integral_constant{}; \ + } + +integral_const_binop(+, operator+); +integral_const_binop(-, operator-); +integral_const_binop(*, operator*); +integral_const_binop(/, operator/); + +integral_const_binop(==, operator==); +integral_const_binop(!=, operator!=); +integral_const_binop(<, operator<); +integral_const_binop(>, operator>); +integral_const_binop(<=, operator<=); +integral_const_binop(>=, operator>=); + +integral_const_binop(&&, operator&&); +integral_const_binop(||, operator||); + +template >> +METAL_FUNC constexpr auto operator||(true_type, T) { + return true_type{}; +} +template >> +METAL_FUNC constexpr auto operator||(T, true_type) { + return true_type{}; +} + +template >> +METAL_FUNC constexpr auto operator&&(false_type, T) { + return false_type{}; +} + +template >> +METAL_FUNC constexpr auto operator&&(T, false_type) { + return false_type{}; +} + +// Dispatch utilities +template +void dispatch_bool(bool v, F f) { + if (v) { + f(true_type{}); + } else { + f(false_type{}); + } +} + +template +constexpr void const_for_loop(F f) { + if constexpr (start < stop) { + constexpr auto idx = Int{}; + f(idx); + const_for_loop(f); + } +} + +#undef integral_const_binop + +/////////////////////////////////////////////////////////////////////////////// +// Reduction operators +/////////////////////////////////////////////////////////////////////////////// + +template +METAL_FUNC constexpr T sum(T x) { + return x; +} + +template +METAL_FUNC constexpr auto sum(T x, Us... us) { + return x + sum(us...); +} + +} // namespace steel +} // namespace mlx + +#pragma METAL internals : disable + +#include + +using namespace metal; + +/////////////////////////////////////////////////////////////////////////////// +// MMA helper +/////////////////////////////////////////////////////////////////////////////// + +namespace mlx { +namespace steel { + +/////////////////////////////////////////////////////////////////////////////// +// NAX Steel with new tiles +/////////////////////////////////////////////////////////////////////////////// + +struct BaseNAXFrag { + STEEL_CONST short kFragRows = 16; + STEEL_CONST short kFragCols = 16; + + STEEL_CONST short kElemsPerFrag = (kFragRows * kFragCols) / 32; + + STEEL_CONST short kElemRows = 2; + STEEL_CONST short kElemCols = 4; + + STEEL_CONST short kElemRowsJump = 8; + + static_assert( + kElemRows * kElemCols == kElemsPerFrag, + "MMAFrag shape is not consistent with MMAFrag size"); + + template + using dtype_frag_t = typename metal::vec; + + METAL_FUNC static short2 get_coord() { + const ushort simd_lane_id = __metal_get_thread_index_in_simdgroup(ushort()); + const short qid = simd_lane_id >> 2; + const short fm = ((qid & 4) | ((simd_lane_id >> 1) & 3)); + const short fn = ((qid & 2) | (simd_lane_id & 1)) * 4; + return short2{fn, fm}; + } + + METAL_FUNC static short2 get_coord(short idx) { + const ushort simd_lane_id = __metal_get_thread_index_in_simdgroup(ushort()); + const short qid = simd_lane_id >> 2; + const short fm = ((qid & 4) | ((simd_lane_id >> 1) & 3)) + (idx >> 2) * 8; + const short fn = ((qid & 2) | (simd_lane_id & 1)) * 4 + idx % 4; + return short2{fn, fm}; + } + + template < + typename T, + typename SrcPtrType, + typename StrX, + typename StrY, + typename OffX = Int<0>, + typename OffY = Int<0>> + METAL_FUNC static constexpr void load( + thread dtype_frag_t& dst, + SrcPtrType src, + StrX str_x, + StrY str_y, + OffX off_x = {}, + OffY off_y = {}) { + const short2 sc = get_coord(); + src += sc.y * str_x + sc.x * str_y; + + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemRows; i++) { + const auto r = off_x + i * kElemRowsJump; + const auto c = off_y; + + if constexpr (metal::is_same_v>) { + STEEL_PRAGMA_UNROLL + for (short j = 0; j < kElemCols; j++) { + dst[i * kElemCols + j] = static_cast(src[r * str_x + c + j]); + } + } else { + STEEL_PRAGMA_UNROLL + for (short j = 0; j < kElemCols; j++) { + dst[i * kElemCols + j] = + static_cast(src[r * str_x + (c + j) * str_y]); + } + } + } + } + + template < + typename T, + typename SrcPtrType, + typename StrX, + typename StrY, + typename LimX, + typename OffX = Int<0>, + typename OffY = Int<0>> + METAL_FUNC static constexpr void load_rows( + thread dtype_frag_t& dst, + SrcPtrType src, + StrX str_x, + StrY str_y, + LimX lim_x, + OffX off_x = {}, + OffY off_y = {}) { + const short2 sc = get_coord(); + src += sc.y * str_x + sc.x * str_y; + auto lx = lim_x - sc.y; + + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemRows; i++) { + const auto r = off_x + i * kElemRowsJump; + const auto c = off_y; + + if (r < lx) { + if constexpr (metal::is_same_v>) { + STEEL_PRAGMA_UNROLL + for (short j = 0; j < kElemCols; j++) { + dst[i * kElemCols + j] = static_cast(src[r * str_x + (c + j)]); + } + } else { + STEEL_PRAGMA_UNROLL + for (short j = 0; j < kElemCols; j++) { + dst[i * kElemCols + j] = + static_cast(src[r * str_x + (c + j) * str_y]); + } + } + + } else { + STEEL_PRAGMA_UNROLL + for (short j = 0; j < kElemCols; j++) { + dst[i * kElemCols + j] = T(0); + } + } + } + } + + template < + typename T, + typename SrcPtrType, + typename StrX, + typename StrY, + typename LimX, + typename LimY, + typename OffX = Int<0>, + typename OffY = Int<0>> + METAL_FUNC static constexpr void load_safe( + thread dtype_frag_t& dst, + SrcPtrType src, + StrX str_x, + StrY str_y, + LimX lim_x, + LimY lim_y, + OffX off_x = {}, + OffY off_y = {}) { + const short2 sc = get_coord(); + src += sc.y * str_x + sc.x * str_y; + auto lx = lim_x - sc.y; + auto ly = lim_y - sc.x; + + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemRows; i++) { + const auto r = off_x + i * kElemRowsJump; + const auto c = off_y; + STEEL_PRAGMA_UNROLL + for (short j = 0; j < kElemCols; j++) { + if ((r < lx) && ((c + j) < ly)) { + dst[i * kElemCols + j] = + static_cast(src[r * str_x + (c + j) * str_y]); + } else { + dst[i * kElemCols + j] = T(0); + } + } + } + } + + template < + typename T, + typename DstPtrType, + typename StrX, + typename StrY, + typename OffX = Int<0>, + typename OffY = Int<0>> + METAL_FUNC static constexpr void store( + const thread dtype_frag_t& src, + DstPtrType dst, + StrX str_x, + StrY str_y, + OffX off_x = {}, + OffY off_y = {}) { + using U = pointer_element_t; + + const short2 sc = get_coord(); + dst += sc.y * str_x + sc.x * str_y; + + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemRows; i++) { + const auto r = off_x + i * kElemRowsJump; + const auto c = off_y; + + if constexpr (metal::is_same_v>) { + STEEL_PRAGMA_UNROLL + for (short j = 0; j < kElemCols; j++) { + dst[r * str_x + c + j] = static_cast(src[i * kElemCols + j]); + } + } else { + STEEL_PRAGMA_UNROLL + for (short j = 0; j < kElemCols; j++) { + dst[r * str_x + (c + j) * str_y] = + static_cast(src[i * kElemCols + j]); + } + } + } + } + + template < + typename T, + typename DstPtrType, + typename StrX, + typename StrY, + typename LimX, + typename OffX = Int<0>, + typename OffY = Int<0>> + METAL_FUNC static constexpr void store_rows( + const thread dtype_frag_t& src, + DstPtrType dst, + StrX str_x, + StrY str_y, + LimX lim_x, + OffX off_x = {}, + OffY off_y = {}) { + using U = pointer_element_t; + + const short2 sc = get_coord(); + dst += sc.y * str_x + sc.x * str_y; + auto lx = lim_x - sc.y; + + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemRows; i++) { + const auto r = off_x + i * kElemRowsJump; + const auto c = off_y; + + if (r < lx) { + if constexpr (metal::is_same_v>) { + STEEL_PRAGMA_UNROLL + for (short j = 0; j < kElemCols; j++) { + dst[r * str_x + c + j] = static_cast(src[i * kElemCols + j]); + } + } else { + STEEL_PRAGMA_UNROLL + for (short j = 0; j < kElemCols; j++) { + dst[r * str_x + (c + j) * str_y] = + static_cast(src[i * kElemCols + j]); + } + } + } + } + } + + template < + typename T, + typename DstPtrType, + typename StrX, + typename StrY, + typename LimX, + typename LimY, + typename OffX = Int<0>, + typename OffY = Int<0>> + METAL_FUNC static constexpr void store_safe( + const thread dtype_frag_t& src, + DstPtrType dst, + StrX str_x, + StrY str_y, + LimX lim_x, + LimY lim_y, + OffX off_x = {}, + OffY off_y = {}) { + using U = pointer_element_t; + + const short2 sc = get_coord(); + dst += sc.y * str_x + sc.x * str_y; + auto lx = lim_x - sc.y; + auto ly = lim_y - sc.x; + + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemRows; i++) { + const auto r = off_x + i * kElemRowsJump; + const auto c = off_y; + + STEEL_PRAGMA_UNROLL + for (short j = 0; j < kElemCols; j++) { + if (r < lx && (c + j) < ly) { + dst[r * str_x + (c + j) * str_y] = + static_cast(src[i * kElemCols + j]); + } + } + } + } + + template < + typename T, + typename DstPtrType, + typename StrX, + typename StrY, + typename StartX, + typename StopX, + typename StartY, + typename StopY, + typename OffX = Int<0>, + typename OffY = Int<0>> + METAL_FUNC static constexpr void store_slice( + const thread dtype_frag_t& src, + DstPtrType dst, + StrX str_x, + StrY str_y, + StartX start_x, + StopX stop_x, + StartY start_y, + StopY stop_y, + OffX off_x = Int<0>{}, + OffY off_y = Int<0>{}) { + using U = pointer_element_t; + + const short2 sc = get_coord(); + + const_for_loop<0, kElemRows, 1>([&](auto idx_row) { + const auto r = off_x + idx_row * Int{}; + if (r >= stop_x - sc.y || r < start_x - sc.y) { + return; + } + + const_for_loop<0, kElemCols, 1>([&](auto idx_col) { + const auto c = off_y + idx_col; + if (c >= stop_y - sc.x || c < start_y - sc.x) { + return; + } + + const auto src_idx = idx_row * Int{} + idx_col; + dst[(r + sc.y) * str_x + (c + sc.x) * str_y] = + static_cast(src[src_idx]); + }); + }); + } + + template + METAL_FUNC static constexpr void row_reduce( + thread const dtype_frag_t& inp_vals, + thread T* reduced_vals) { + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemRows; i++) { + T thr_reduce = Op::apply( + Op::apply(inp_vals[i * kElemCols + 0], inp_vals[i * kElemCols + 1]), + Op::apply(inp_vals[i * kElemCols + 2], inp_vals[i * kElemCols + 3])); + + T qgr_reduce = simd_shuffle_xor(thr_reduce, ushort(1)); + qgr_reduce = Op::apply(thr_reduce, qgr_reduce); + + T sgr_reduce = simd_shuffle_xor(qgr_reduce, ushort(8)); + sgr_reduce = Op::apply(qgr_reduce, sgr_reduce); + + reduced_vals[i] = Op::apply(reduced_vals[i], sgr_reduce); + } + } + + template + METAL_FUNC static constexpr void row_bin_op( + thread dtype_frag_t& inp_vals, + thread T* row_vals) { + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemRows; i++) { + STEEL_PRAGMA_UNROLL + for (short j = 0; j < kElemCols; j++) { + inp_vals[i * kElemCols + j] = + Op::apply(inp_vals[i * kElemCols + j], row_vals[i]); + } + } + } + + template < + typename CType, + typename AType, + typename BType, + bool transpose_a = false, + bool transpose_b = false> + METAL_FUNC static constexpr void mma( + thread dtype_frag_t& Cn0, + thread dtype_frag_t& Cn1, + const thread dtype_frag_t& A, + metal::bool_constant, + const thread dtype_frag_t& Bn0, + const thread dtype_frag_t& Bn1, + metal::bool_constant) { + constexpr auto desc = mpp::tensor_ops::matmul2d_descriptor( + 16, + 32, + 16, + transpose_a, + transpose_b, + true, + mpp::tensor_ops::matmul2d_descriptor::mode::multiply_accumulate); + + // Create matmul op + mpp::tensor_ops::matmul2d gemm_op; + + // Create matmul operands in registers + auto ct_a = + gemm_op + .template get_left_input_cooperative_tensor(); + auto ct_b = + gemm_op + .template get_right_input_cooperative_tensor(); + + // Create matmul output in register + auto ct_c = gemm_op.template get_destination_cooperative_tensor< + metal::remove_addrspace_t, + metal::remove_addrspace_t, + CType>(); + + // Load A in to left operand registers + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemsPerFrag; i++) { + ct_a[i] = A[i]; + } + + // Load B into right operand registers + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemsPerFrag; i++) { + ct_b[i] = Bn0[i]; + ct_b[kElemsPerFrag + i] = Bn1[i]; + } + + // Load C into output registers (op handles accumulation) + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemsPerFrag; i++) { + ct_c[i] = Cn0[i]; + ct_c[kElemsPerFrag + i] = Cn1[i]; + } + + // Do matmul + gemm_op.run(ct_a, ct_b, ct_c); + + // Copy out results + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemsPerFrag; i++) { + Cn0[i] = ct_c[i]; + Cn1[i] = ct_c[kElemsPerFrag + i]; + } + } + + template < + typename CType, + typename AType, + typename BType, + bool transpose_a = false, + bool transpose_b = false> + METAL_FUNC static constexpr void mma( + thread dtype_frag_t& Cm0, + thread dtype_frag_t& Cm1, + const thread dtype_frag_t& Am0, + const thread dtype_frag_t& Am1, + metal::bool_constant, + const thread dtype_frag_t& B, + metal::bool_constant) { + // Create Matmul descriptor + constexpr auto desc = mpp::tensor_ops::matmul2d_descriptor( + 16, + 32, + 16, + transpose_a, + transpose_b, + true, + mpp::tensor_ops::matmul2d_descriptor::mode::multiply_accumulate); + + // Create matmul op + mpp::tensor_ops::matmul2d gemm_op; + + // Create matmul operands in registers + auto ct_a = + gemm_op + .template get_left_input_cooperative_tensor(); + auto ct_b = + gemm_op + .template get_right_input_cooperative_tensor(); + + // Create matmul output in register + auto ct_c = gemm_op.template get_destination_cooperative_tensor< + metal::remove_addrspace_t, + metal::remove_addrspace_t, + CType>(); + + // Load A in to left operand registers + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemsPerFrag; i++) { + ct_a[i] = Am0[i]; + ct_a[kElemsPerFrag + i] = Am1[i]; + } + + // Load B into right operand registers + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemsPerFrag; i++) { + ct_b[i] = B[i]; + } + + // Load C into output registers (op handles accumulation) + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemsPerFrag; i++) { + ct_c[i] = Cm0[i]; + ct_c[kElemsPerFrag + i] = Cm1[i]; + } + + // Do matmul + gemm_op.run(ct_a, ct_b, ct_c); + + // Copy out results + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kElemsPerFrag; i++) { + Cm0[i] = ct_c[i]; + Cm1[i] = ct_c[kElemsPerFrag + i]; + } + } +}; + +template < + typename T, + short kTileRows_, + short kTileCols_, + class NAXFrag_ = BaseNAXFrag> +struct NAXTile { + using NAXFrag_t = NAXFrag_; + using elem_type = T; + + STEEL_CONST short kFragRows = NAXFrag_t::kFragRows; + STEEL_CONST short kFragCols = NAXFrag_t::kFragCols; + STEEL_CONST short kElemsPerFrag = NAXFrag_t::kElemsPerFrag; + + STEEL_CONST short kTileRows = kTileRows_; + STEEL_CONST short kTileCols = kTileCols_; + + STEEL_CONST short kRows = kTileRows * kFragRows; + STEEL_CONST short kCols = kTileCols * kFragCols; + + STEEL_CONST short kNumFrags = kTileRows * kTileCols; + STEEL_CONST short kElemsPerTile = kNumFrags * kElemsPerFrag; + + STEEL_CONST short kFragThrRows = NAXFrag_t::kElemRows; + STEEL_CONST short kFragThrCols = NAXFrag_t::kElemCols; + STEEL_CONST short kFragRowsJump = NAXFrag_t::kElemRowsJump; + + STEEL_CONST short kRowsPerThread = kTileRows * NAXFrag_t::kElemRows; + STEEL_CONST short kColsPerThread = kTileCols * NAXFrag_t::kElemCols; + + typedef typename NAXFrag_t::template dtype_frag_t frag_type; + + frag_type val_frags[kNumFrags]; // = {frag_type(0)}; + + METAL_FUNC NAXTile() thread {} + + METAL_FUNC constexpr void clear() thread { + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kNumFrags; ++i) { + val_frags[i] = frag_type(0); + } + } + + METAL_FUNC constexpr thread frag_type& frag_at(const short i, const short j) + thread { + return val_frags[i * kTileCols + j]; + } + + METAL_FUNC constexpr const thread frag_type& frag_at( + const short i, + const short j) const thread { + return val_frags[i * kTileCols + j]; + } + + template + METAL_FUNC constexpr thread frag_type& frag_at() thread { + return val_frags[i * kTileCols + j]; + } + + template + METAL_FUNC constexpr const thread frag_type& frag_at() const thread { + return val_frags[i * kTileCols + j]; + } + + template + METAL_FUNC constexpr thread frag_type& frag_at( + const short i, + const short j, + metal::bool_constant) thread { + if constexpr (transpose) { + return frag_at(j, i); + } else { + return frag_at(i, j); + } + } + + template + METAL_FUNC constexpr const thread frag_type& frag_at( + const short i, + const short j, + metal::bool_constant) const thread { + if constexpr (transpose) { + return frag_at(j, i); + } else { + return frag_at(i, j); + } + } + + template + METAL_FUNC constexpr thread frag_type& frag_at() thread { + if constexpr (transpose) { + return frag_at(); + } else { + return frag_at(); + } + } + + template + METAL_FUNC constexpr const thread frag_type& frag_at() const thread { + if constexpr (transpose) { + return frag_at(); + } else { + return frag_at(); + } + } + + METAL_FUNC thread elem_type* elems() thread { + return reinterpret_cast(val_frags); + } + + METAL_FUNC const thread elem_type* elems() const thread { + return reinterpret_cast(val_frags); + } + + template + METAL_FUNC void row_reduce( + thread metal::vec& vals) const thread { + auto vptr = (thread T*)(&vals); + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kTileRows; ++i) { + STEEL_PRAGMA_UNROLL + for (short j = 0; j < kTileCols; ++j) { + NAXFrag_t::template row_reduce( + frag_at(i, j), &vptr[i * kFragThrRows]); + } + } + } + + template + METAL_FUNC void row_bin_op( + thread metal::vec& vals) thread { + auto vptr = (thread T*)(&vals); + STEEL_PRAGMA_UNROLL + for (short i = 0; i < kTileRows; ++i) { + STEEL_PRAGMA_UNROLL + for (short j = 0; j < kTileCols; ++j) { + NAXFrag_t::template row_bin_op( + frag_at(i, j), &vptr[i * kFragThrRows]); + } + } + } + + template + METAL_FUNC void load(const threadgroup U* src) thread { + const_for_loop<0, kTileRows, 1>([&](auto idx_row) { + const_for_loop<0, kTileCols, 1>([&](auto idx_col) { + NAXFrag_t::load( + frag_at(), + src, + Int{}, + Int{}, + idx_row * Int{}, + idx_col * Int{}); + }); + }); + } + + template + METAL_FUNC void store(threadgroup U* dst) const thread { + const_for_loop<0, kTileRows, 1>([&](auto idx_row) { + const_for_loop<0, kTileCols, 1>([&](auto idx_col) { + NAXFrag_t::store( + frag_at(), + dst, + Int{}, + Int{}, + idx_row * Int{}, + idx_col * Int{}); + }); + }); + } + + template + METAL_FUNC void load(const device U* src, const int ld) thread { + const_for_loop<0, kTileRows, 1>([&](auto idx_row) { + const_for_loop<0, kTileCols, 1>([&](auto idx_col) { + NAXFrag_t::load( + frag_at(), + src, + ld, + Int<1>{}, + idx_row * Int{}, + idx_col * Int{}); + }); + }); + } + + template + METAL_FUNC void store(device U* dst, const int ld) const thread { + const_for_loop<0, kTileRows, 1>([&](auto idx_row) { + const_for_loop<0, kTileCols, 1>([&](auto idx_col) { + NAXFrag_t::store( + frag_at(), + dst, + ld, + Int<1>{}, + idx_row * Int{}, + idx_col * Int{}); + }); + }); + } + + template + METAL_FUNC void + load_rows(const device U* src, const int ld, const short n_rows) thread { + const_for_loop<0, kTileRows, 1>([&](auto idx_row) { + const_for_loop<0, kTileCols, 1>([&](auto idx_col) { + NAXFrag_t::load_rows( + frag_at(), + src, + ld, + Int<1>{}, + n_rows, + idx_row * Int{}, + idx_col * Int{}); + }); + }); + } + + template + METAL_FUNC void load_safe( + const device U* src, + const int ld, + const short2 src_tile_dims) thread { + const_for_loop<0, kTileRows, 1>([&](auto idx_row) { + const_for_loop<0, kTileCols, 1>([&](auto idx_col) { + NAXFrag_t::load_safe( + frag_at(), + src, + ld, + Int<1>{}, + src_tile_dims.y, + src_tile_dims.x, + idx_row * Int{}, + idx_col * Int{}); + }); + }); + } + + template + METAL_FUNC void store_rows(device U* dst, const int ld, const short n_rows) + const thread { + const_for_loop<0, kTileRows, 1>([&](auto idx_row) { + const_for_loop<0, kTileCols, 1>([&](auto idx_col) { + NAXFrag_t::store_rows( + frag_at(), + dst, + ld, + Int<1>{}, + n_rows, + idx_row * Int{}, + idx_col * Int{}); + }); + }); + } + + template + METAL_FUNC void store_safe( + device U* dst, + const int ld, + const short2 dst_tile_dims) const thread { + const_for_loop<0, kTileRows, 1>([&](auto idx_row) { + const_for_loop<0, kTileCols, 1>([&](auto idx_col) { + NAXFrag_t::store_safe( + frag_at(), + dst, + ld, + Int<1>{}, + dst_tile_dims.y, + dst_tile_dims.x, + idx_row * Int{}, + idx_col * Int{}); + }); + }); + } + + template + METAL_FUNC void store_slice( + device U* dst, + const int ld, + const short2 start, + const short2 stop) const thread { + const_for_loop<0, kTileRows, 1>([&](auto idx_row) { + const_for_loop<0, kTileCols, 1>([&](auto idx_col) { + NAXFrag_t::store_slice( + frag_at(), + dst, + ld, + Int<1>{}, + start.y, + stop.y, + start.x, + stop.x, + idx_row * Int{}, + idx_col * Int{}); + }); + }); + } +}; + +template < + class CTile, + class ATile, + class BTile, + bool transpose_a, + bool transpose_b> +METAL_FUNC void tile_matmad_nax( + thread CTile& C, + thread ATile& A, + metal::bool_constant, + thread BTile& B, + metal::bool_constant) { + // Static checks + constexpr short TMa = transpose_a ? ATile::kTileCols : ATile::kTileRows; + constexpr short TM = CTile::kTileRows; + static_assert(TMa == TM, "MXU tile matmul: M dimensions do not match"); + + constexpr short TNb = transpose_b ? BTile::kTileRows : BTile::kTileCols; + constexpr short TN = CTile::kTileCols; + static_assert(TNb == TN, "MXU tile matmul: N dimensions do not match"); + + constexpr short TKa = transpose_a ? ATile::kTileRows : ATile::kTileCols; + constexpr short TK = transpose_b ? BTile::kTileCols : BTile::kTileRows; + static_assert(TKa == TK, "MXU tile matmul: K dimensions do not match"); + + constexpr auto ta = metal::bool_constant{}; + constexpr auto tb = metal::bool_constant{}; + + if constexpr (TN == 1 && TM % 2 == 0) { + STEEL_PRAGMA_UNROLL + for (short mm = 0; mm < TM; mm += 2) { + STEEL_PRAGMA_UNROLL + for (short nn = 0; nn < TN; ++nn) { + STEEL_PRAGMA_UNROLL + for (short kk = 0; kk < TK; ++kk) { + CTile::NAXFrag_t::mma( + C.frag_at(mm, nn), + C.frag_at(mm + 1, nn), + A.frag_at(mm, kk, ta), + A.frag_at(mm + 1, kk, ta), + metal::bool_constant{}, + B.frag_at(kk, nn, tb), + metal::bool_constant{}); + } + } + } + } else if constexpr (TN % 2 == 0) { + STEEL_PRAGMA_UNROLL + for (short mm = 0; mm < TM; ++mm) { + STEEL_PRAGMA_UNROLL + for (short nn = 0; nn < TN; nn += 2) { + STEEL_PRAGMA_UNROLL + for (short kk = 0; kk < TK; ++kk) { + CTile::NAXFrag_t::mma( + C.frag_at(mm, nn), + C.frag_at(mm, nn + 1), + A.frag_at(mm, kk, ta), + metal::bool_constant{}, + B.frag_at(kk, nn, tb), + B.frag_at(kk, nn + 1, tb), + metal::bool_constant{}); + } + } + } + } +} + +} // namespace steel +} // namespace mlx +// Copyright © 2024 Apple Inc. + + +/////////////////////////////////////////////////////////////////////////////// +// GEMM param classes +/////////////////////////////////////////////////////////////////////////////// + +namespace mlx { +namespace steel { + +struct GEMMParams { + const int M; + const int N; + const int K; + + const int lda; + const int ldb; + const int ldd; + + const int tiles_n; + const int tiles_m; + + const int64_t batch_stride_a; + const int64_t batch_stride_b; + const int64_t batch_stride_d; + + const int swizzle_log; + const int gemm_k_iterations_aligned; + + const int batch_ndim; +}; + +struct GEMMSpiltKParams { + const int M; + const int N; + const int K; + + const int lda; + const int ldb; + const int ldc; + + const int tiles_n; + const int tiles_m; + + const int split_k_partitions; + const int split_k_partition_stride; + const int split_k_partition_size; + + const int swizzle_log; + const int gemm_k_iterations_aligned; +}; + +struct GEMMAddMMParams { + const int ldc; + const int fdc; + + const int64_t batch_stride_c; + + const float alpha; + const float beta; +}; + +} // namespace steel +} // namespace mlx +// Copyright © 2024 Apple Inc. + + +// Copyright © 2024 Apple Inc. + + +#include + +METAL_FUNC ulong2 elem_to_loc_broadcast( + uint elem, + constant const int* shape, + constant const int64_t* a_strides, + constant const int64_t* b_strides, + int ndim) { + ulong loc_a{0}; + ulong loc_b{0}; + for (int i = ndim - 1; i >= 0 && elem > 0; --i) { + int pos_in_dim = (elem % shape[i]); + elem /= shape[i]; + loc_a += pos_in_dim * a_strides[i]; + loc_b += pos_in_dim * b_strides[i]; + } + return ulong2(loc_a, loc_b); +} + +METAL_FUNC ulong3 elem_to_loc_broadcast( + uint elem, + constant const int* shape, + constant const int64_t* a_strides, + constant const int64_t* b_strides, + constant const int64_t* c_strides, + int ndim) { + ulong loc_a{0}; + ulong loc_b{0}; + ulong loc_c{0}; + for (int i = ndim - 1; i >= 0 && elem > 0; --i) { + int pos_in_dim = (elem % shape[i]); + elem /= shape[i]; + loc_a += pos_in_dim * a_strides[i]; + loc_b += pos_in_dim * b_strides[i]; + loc_c += pos_in_dim * c_strides[i]; + } + return ulong3(loc_a, loc_b, loc_c); +} + +/////////////////////////////////////////////////////////////////////////////// +// Transforms and Epilogues +/////////////////////////////////////////////////////////////////////////////// + +namespace mlx { +namespace steel { + +template +struct TransformNone { + static METAL_FUNC OutT apply(InT x) { + return static_cast(x); + } + + static METAL_FUNC OutT apply(InT x, OutT) { + return static_cast(x); + } +}; + +template +struct TransformAdd { + TransformAdd(const float, const float) thread {} + + static METAL_FUNC OutT apply(InT x) { + return static_cast(x); + } + + static METAL_FUNC OutT apply(InT x, OutT c) { + return static_cast(x) + c; + } +}; + +template +struct TransformAxpby { + const float alpha; + const float beta; + + TransformAxpby(const float alpha_, const float beta_) thread : alpha(alpha_), + beta(beta_) {} + + static METAL_FUNC OutT apply(InT x) { + return static_cast(x); + } + + METAL_FUNC OutT apply(InT x, OutT c) const thread { + return static_cast( + x * static_cast(alpha) + (static_cast(beta) * c)); + } +}; + +template +struct AccumHelper { + typedef float accum_type; +}; + +struct BlockSwizzle { + static METAL_FUNC int2 + swizzle(uint3 tid [[threadgroup_position_in_grid]], const int swizzle_log) { + const int tid_x = (tid.x) >> swizzle_log; + const int tid_y = + ((tid.y) << swizzle_log) + ((tid.x) & ((1 << swizzle_log) - 1)); + return int2(tid_x, tid_y); + } +}; + +} // namespace steel +} // namespace mlx + +using namespace metal; + +namespace mlx::steel { + +template < + typename T, + short SM, + short SN, + short SK, + short BK, + bool transpose_a, + bool transpose_b, + bool kAlignedM, + bool kAlignedN, + bool kAlignedK, + typename AccumType = float> +auto gemm_loop( + const device T* A, + const device T* B, + int lda, + int ldb, + int K, + int gemm_k_iterations_aligned, + const short sgp_sm, + const short sgp_sn) { + constexpr short TM = SM / 16; + constexpr short TN = SN / 16; + constexpr short TK = SK / 16; + + constexpr int RA = transpose_a ? TK : TM; + constexpr int CA = transpose_a ? TM : TK; + + constexpr int RB = transpose_b ? TN : TK; + constexpr int CB = transpose_b ? TK : TN; + + NAXTile Dtile; + Dtile.clear(); + + const bool has_output = sgp_sm > 0 && sgp_sn > 0; + + int gemm_k_iterations_ = gemm_k_iterations_aligned; + + STEEL_PRAGMA_NO_UNROLL + for (int kk0 = 0; kk0 < gemm_k_iterations_; kk0++) { + threadgroup_barrier(mem_flags::mem_none); + if constexpr (!kAlignedM || !kAlignedN) { + if (!has_output) + continue; + } + + STEEL_PRAGMA_NO_UNROLL + for (int kk1 = 0; kk1 < BK; kk1 += SK) { + NAXTile Atile; + NAXTile Btile; + const int k = kk1; + + volatile int compiler_barrier; + + const int A_offset = transpose_a ? k * lda : k; + const int B_offset = transpose_b ? k : k * ldb; + + if constexpr (kAlignedM) { + Atile.load(A + A_offset, lda); + } else { + const short rmax = transpose_a ? SK : sgp_sm; + const short cmax = transpose_a ? sgp_sm : SK; + Atile.load_safe(A + A_offset, lda, short2(cmax, rmax)); + } + + if constexpr (kAlignedN) { + Btile.load(B + B_offset, ldb); + } else { + const short rmax = transpose_b ? sgp_sn : SK; + const short cmax = transpose_b ? SK : sgp_sn; + Btile.load_safe(B + B_offset, ldb, short2(cmax, rmax)); + } + + tile_matmad_nax( + Dtile, + Atile, + metal::bool_constant{}, + Btile, + metal::bool_constant{}); + + (void)compiler_barrier; + } + + A += transpose_a ? (BK * lda) : BK; + B += transpose_b ? BK : (BK * ldb); + } + + if constexpr (!kAlignedK) { + simdgroup_barrier(mem_flags::mem_none); + if constexpr (!kAlignedM || !kAlignedN) { + if (!has_output) + return Dtile; + } + + const short rem_bk = K - gemm_k_iterations_ * BK; + + STEEL_PRAGMA_NO_UNROLL + for (int kk1 = 0; kk1 < rem_bk; kk1 += SK) { + NAXTile Atile; + NAXTile Btile; + + const int k = kk1; + const short psk = max(0, rem_bk - k); + + const short2 Aklims = + transpose_a ? short2(sgp_sm, psk) : short2(psk, sgp_sm); + const short2 Bklims = + transpose_b ? short2(psk, sgp_sn) : short2(sgp_sn, psk); + + const int A_offset = transpose_a ? k * lda : k; + const int B_offset = transpose_b ? k : k * ldb; + + Atile.load_safe(A + A_offset, lda, Aklims); + Btile.load_safe(B + B_offset, ldb, Bklims); + + tile_matmad_nax( + Dtile, + Atile, + metal::bool_constant{}, + Btile, + metal::bool_constant{}); + } + } + + return Dtile; +} + +} // namespace mlx::steel +// Copyright © 2023-2024 Apple Inc. + +#include +#include + +template +METAL_FUNC void gemm_loop_aligned( + threadgroup T* As, + threadgroup T* Bs, + thread mma_t& mma_op, + thread loader_a_t& loader_a, + thread loader_b_t& loader_b, + const int k_iterations) { + for (int k = 0; k < k_iterations; k++) { + threadgroup_barrier(mem_flags::mem_threadgroup); + + // Load elements into threadgroup memory + loader_a.load_unsafe(); + loader_b.load_unsafe(); + + threadgroup_barrier(mem_flags::mem_threadgroup); + + // Multiply and accumulate threadgroup elements + mma_op.mma(As, Bs); + + // Prepare for next iteration + loader_a.next(); + loader_b.next(); + } +} + +template < + bool rows_aligned, + bool cols_aligned, + bool transpose, + typename T, + typename mma_t, + typename loader_a_t, + typename loader_b_t> +METAL_FUNC void gemm_loop_unaligned( + threadgroup T* As, + threadgroup T* Bs, + thread mma_t& mma_op, + thread loader_a_t& loader_a, + thread loader_b_t& loader_b, + const int k_iterations, + const short tgp_bm, + const short tgp_bn, + const short tgp_bk) { + for (int k = 0; k < k_iterations; k++) { + threadgroup_barrier(mem_flags::mem_threadgroup); + + // Load elements into threadgroup memory + if (rows_aligned) { + loader_a.load_unsafe(); + } else { + loader_a.load_safe(short2(tgp_bk, tgp_bm)); + } + if (cols_aligned) { + loader_b.load_unsafe(); + } else { + loader_b.load_safe( + transpose ? short2(tgp_bk, tgp_bn) : short2(tgp_bn, tgp_bk)); + } + + threadgroup_barrier(mem_flags::mem_threadgroup); + + // Multiply and accumulate threadgroup elements + mma_op.mma(As, Bs); + + // Prepare for next iteration + loader_a.next(); + loader_b.next(); + } +} + +template +METAL_FUNC void gemm_loop_finalize( + threadgroup T* As, + threadgroup T* Bs, + thread mma_t& mma_op, + thread loader_a_t& loader_a, + thread loader_b_t& loader_b, + const short2 tile_a, + const short2 tile_b) { + loader_a.load_safe(tile_a); + loader_b.load_safe(tile_b); + threadgroup_barrier(mem_flags::mem_threadgroup); + mma_op.mma(As, Bs); +} +// Copyright © 2023-2024 Apple Inc. + +#include +#include + +using namespace metal; +using namespace mlx::steel; + +constant bool align_M [[function_constant(200)]]; +constant bool align_N [[function_constant(201)]]; +constant bool align_K [[function_constant(202)]]; + +using namespace metal; + +#define MLX_MTL_CONST static constant constexpr const + +MLX_MTL_CONST int SIMD_SIZE = 32; +MLX_MTL_CONST int QUAD_SIZE = 4; + +template +inline constexpr short get_pack_factor() { + return (bits == 3 || bits == 5) ? 8 : (bits == 6 ? 4 : wsize / bits); +} + +template +inline constexpr short get_bytes_per_pack() { + constexpr int power_of_2_bits = (bits & (bits - 1)) == 0; + return power_of_2_bits ? (wsize / 8) : (bits == 5 ? 5 : 3); +} + +template +inline U load_vector(const device T* x, thread U* x_thread) { + static_assert( + bits == 2 || bits == 3 || bits == 4 || bits == 5 || bits == 6 || + bits == 8, + "Template undefined for bits not in {2, 3, 4, 5, 6, 8}"); + + U sum = 0; + + if (bits == 2) { + for (int i = 0; i < values_per_thread; i += 4) { + sum += x[i] + x[i + 1] + x[i + 2] + x[i + 3]; + x_thread[i] = x[i]; + x_thread[i + 1] = x[i + 1] / 4.0f; + x_thread[i + 2] = x[i + 2] / 16.0f; + x_thread[i + 3] = x[i + 3] / 64.0f; + } + } + + else if (bits == 3) { + for (int i = 0; i < values_per_thread; i += 8) { + sum += x[i] + x[i + 1] + x[i + 2] + x[i + 3] + x[i + 4] + x[i + 5] + + x[i + 6] + x[i + 7]; + x_thread[i] = x[i]; + x_thread[i + 1] = x[i + 1] / 8.0f; + x_thread[i + 2] = x[i + 2] / 64.0f; + x_thread[i + 3] = x[i + 3] / 2.0f; + x_thread[i + 4] = x[i + 4] / 16.0f; + x_thread[i + 5] = x[i + 5] / 128.0f; + x_thread[i + 6] = x[i + 6] / 4.0f; + x_thread[i + 7] = x[i + 7] / 32.0f; + } + } + + else if (bits == 4) { + for (int i = 0; i < values_per_thread; i += 4) { + sum += x[i] + x[i + 1] + x[i + 2] + x[i + 3]; + x_thread[i] = x[i]; + x_thread[i + 1] = x[i + 1] / 16.0f; + x_thread[i + 2] = x[i + 2] / 256.0f; + x_thread[i + 3] = x[i + 3] / 4096.0f; + } + } + + else if (bits == 5) { + for (int i = 0; i < values_per_thread; i += 8) { + sum += x[i] + x[i + 1] + x[i + 2] + x[i + 3] + x[i + 4] + x[i + 5] + + x[i + 6] + x[i + 7]; + x_thread[i] = x[i]; + x_thread[i + 1] = x[i + 1] / 32.0f; + x_thread[i + 2] = x[i + 2] / 4.0f; + x_thread[i + 3] = x[i + 3] / 128.0f; + x_thread[i + 4] = x[i + 4] / 16.0f; + x_thread[i + 5] = x[i + 5] / 2.0f; + x_thread[i + 6] = x[i + 6] / 64.0f; + x_thread[i + 7] = x[i + 7] / 8.0f; + } + } + + else if (bits == 6) { + for (int i = 0; i < values_per_thread; i += 4) { + sum += x[i] + x[i + 1] + x[i + 2] + x[i + 3]; + x_thread[i] = x[i]; + x_thread[i + 1] = x[i + 1] / 64.0f; + x_thread[i + 2] = x[i + 2] / 16.0f; + x_thread[i + 3] = x[i + 3] / 4.0f; + } + } + + else if (bits == 8) { + for (int i = 0; i < values_per_thread; i++) { + sum += x[i]; + x_thread[i] = x[i]; + } + } + + return sum; +} + +template +inline U load_vector_safe(const device T* x, thread U* x_thread, int N) { + static_assert( + bits == 2 || bits == 3 || bits == 4 || bits == 5 || bits == 6 || + bits == 8, + "Template undefined for bits not in {2, 3, 4, 5, 6, 8}"); + + U sum = 0; + + if (bits == 2) { + for (int i = 0; i < N; i += 4) { + sum += x[i] + x[i + 1] + x[i + 2] + x[i + 3]; + x_thread[i] = x[i]; + x_thread[i + 1] = x[i + 1] / 4.0f; + x_thread[i + 2] = x[i + 2] / 16.0f; + x_thread[i + 3] = x[i + 3] / 64.0f; + } + } + + else if (bits == 3) { + for (int i = 0; i < N; i += 8) { + sum += x[i] + x[i + 1] + x[i + 2] + x[i + 3] + x[i + 4] + x[i + 5] + + x[i + 6] + x[i + 7]; + + x_thread[i] = x[i]; + x_thread[i + 1] = x[i + 1] / 8.0f; + x_thread[i + 2] = x[i + 2] / 64.0f; + x_thread[i + 3] = x[i + 3] / 2.0f; + x_thread[i + 4] = x[i + 4] / 16.0f; + x_thread[i + 5] = x[i + 5] / 128.0f; + x_thread[i + 6] = x[i + 6] / 4.0f; + x_thread[i + 7] = x[i + 7] / 32.0f; + } + } + + else if (bits == 4) { + for (int i = 0; i < N; i += 4) { + sum += x[i] + x[i + 1] + x[i + 2] + x[i + 3]; + x_thread[i] = x[i]; + x_thread[i + 1] = x[i + 1] / 16.0f; + x_thread[i + 2] = x[i + 2] / 256.0f; + x_thread[i + 3] = x[i + 3] / 4096.0f; + } + } + + else if (bits == 5) { + for (int i = 0; i < N; i += 8) { + sum += x[i] + x[i + 1] + x[i + 2] + x[i + 3] + x[i + 4] + x[i + 5] + + x[i + 6] + x[i + 7]; + x_thread[i] = x[i]; + x_thread[i + 1] = x[i + 1] / 32.0f; + x_thread[i + 2] = x[i + 2] / 4.0f; + x_thread[i + 3] = x[i + 3] / 128.0f; + x_thread[i + 4] = x[i + 4] / 16.0f; + x_thread[i + 5] = x[i + 5] / 2.0f; + x_thread[i + 6] = x[i + 6] / 64.0f; + x_thread[i + 7] = x[i + 7] / 8.0f; + } + } + + else if (bits == 6) { + for (int i = 0; i < N; i += 4) { + sum += x[i] + x[i + 1] + x[i + 2] + x[i + 3]; + x_thread[i] = x[i]; + x_thread[i + 1] = x[i + 1] / 64.0f; + x_thread[i + 2] = x[i + 2] / 16.0f; + x_thread[i + 3] = x[i + 3] / 4.0f; + } + } + + else if (bits == 8) { + for (int i = 0; i < N; i++) { + sum += x[i]; + x_thread[i] = x[i]; + } + } + + for (int i = N; i < values_per_thread; i++) { + x_thread[i] = 0; + } + + return sum; +} + +template +inline U qdot( + const device uint8_t* w, + const thread U* x_thread, + U scale, + U bias, + U sum) { + static_assert( + bits == 2 || bits == 3 || bits == 4 || bits == 5 || bits == 6 || + bits == 8, + "Template undefined for bits not in {2, 3, 4, 5, 6, 8}"); + + U accum = 0; + + if (bits == 2) { + for (int i = 0; i < (values_per_thread / 4); i++) { + accum += + (x_thread[4 * i] * (w[i] & 0x03) + + x_thread[4 * i + 1] * (w[i] & 0x0c) + + x_thread[4 * i + 2] * (w[i] & 0x30) + + x_thread[4 * i + 3] * (w[i] & 0xc0)); + } + } + + else if (bits == 3) { + for (int i = 0; i < (values_per_thread / 8); i++) { + x_thread += 8 * i; + w += 3 * i; + + accum += (w[0] & 0x07) * x_thread[0]; + accum += (w[0] & 0x38) * x_thread[1]; + accum += (w[0] & 0xc0) * x_thread[2]; + accum += (w[1] & 0x01) * (x_thread[2] * 256.0f); + + accum += (w[1] & 0x0e) * x_thread[3]; + accum += (w[1] & 0x70) * x_thread[4]; + accum += (w[1] & 0x80) * x_thread[5]; + accum += (w[2] & 0x03) * (x_thread[5] * 256.0f); + + accum += (w[2] & 0x1c) * x_thread[6]; + accum += (w[2] & 0xe0) * x_thread[7]; + } + } + + else if (bits == 4) { + const device uint16_t* ws = (const device uint16_t*)w; + for (int i = 0; i < (values_per_thread / 4); i++) { + accum += + (x_thread[4 * i] * (ws[i] & 0x000f) + + x_thread[4 * i + 1] * (ws[i] & 0x00f0) + + x_thread[4 * i + 2] * (ws[i] & 0x0f00) + + x_thread[4 * i + 3] * (ws[i] & 0xf000)); + } + } + + else if (bits == 5) { + for (int i = 0; i < (values_per_thread / 8); i++) { + x_thread += 8 * i; + w += 5 * i; + + accum += (w[0] & 0x1f) * x_thread[0]; + accum += (w[0] & 0xe0) * x_thread[1]; + accum += (w[1] & 0x3) * (x_thread[1] * 256.0f); + accum += (w[1] & 0x7c) * x_thread[2]; + accum += (w[1] & 0x80) * x_thread[3]; + accum += (w[2] & 0xf) * (x_thread[3] * 256.0f); + accum += (w[2] & 0xf0) * x_thread[4]; + accum += (w[3] & 0x1) * (x_thread[4] * 256.0f); + accum += (w[3] & 0x3e) * x_thread[5]; + accum += (w[3] & 0xc0) * x_thread[6]; + accum += (w[4] & 0x7) * (x_thread[6] * 256.0f); + accum += (w[4] & 0xf8) * x_thread[7]; + } + } + + else if (bits == 6) { + for (int i = 0; i < (values_per_thread / 4); i++) { + x_thread += 4 * i; + w += 3 * i; + + accum += (w[0] & 0x3f) * x_thread[0]; + + accum += (w[0] & 0xc0) * x_thread[1]; + accum += (w[1] & 0x0f) * (x_thread[1] * 256.0f); + + accum += (w[1] & 0xf0) * x_thread[2]; + accum += (w[2] & 0x03) * (x_thread[2] * 256.0f); + + accum += (w[2] & 0xfc) * x_thread[3]; + } + } + + else if (bits == 8) { + for (int i = 0; i < values_per_thread; i++) { + accum += x_thread[i] * w[i]; + } + } + + return scale * accum + sum * bias; +} + +template +inline U qdot_safe( + const device uint8_t* w, + const thread U* x_thread, + U scale, + U bias, + U sum, + int N) { + static_assert( + bits == 2 || bits == 3 || bits == 4 || bits == 5 || bits == 6 || + bits == 8, + "Template undefined for bits not in {2, 3, 4, 5, 6, 8}"); + + U accum = 0; + + if (bits == 2) { + for (int i = 0; i < (N / 4); i++) { + accum += + (x_thread[4 * i] * (w[i] & 0x03) + + x_thread[4 * i + 1] * (w[i] & 0x0c) + + x_thread[4 * i + 2] * (w[i] & 0x30) + + x_thread[4 * i + 3] * (w[i] & 0xc0)); + } + } + + else if (bits == 3) { + for (int i = 0; i < (N / 8); i++) { + x_thread += 8 * i; + w += 3 * i; + + accum += (w[0] & 0x07) * x_thread[0]; + accum += (w[0] & 0x38) * x_thread[1]; + accum += (w[0] & 0xc0) * x_thread[2]; + accum += (w[1] & 0x01) * (x_thread[2] * 256.0f); + + accum += (w[1] & 0x0e) * x_thread[3]; + accum += (w[1] & 0x70) * x_thread[4]; + accum += (w[1] & 0x80) * x_thread[5]; + accum += (w[2] & 0x03) * (x_thread[5] * 256.0f); + + accum += (w[2] & 0x1c) * x_thread[6]; + accum += (w[2] & 0xe0) * x_thread[7]; + } + } + + else if (bits == 4) { + const device uint16_t* ws = (const device uint16_t*)w; + for (int i = 0; i < (N / 4); i++) { + accum += + (x_thread[4 * i] * (ws[i] & 0x000f) + + x_thread[4 * i + 1] * (ws[i] & 0x00f0) + + x_thread[4 * i + 2] * (ws[i] & 0x0f00) + + x_thread[4 * i + 3] * (ws[i] & 0xf000)); + } + } + + else if (bits == 5) { + for (int i = 0; i < (N / 8); i++) { + x_thread += 8 * i; + w += 5 * i; + + accum += (w[0] & 0x1f) * x_thread[0]; + accum += (w[0] & 0xe0) * x_thread[1]; + accum += (w[1] & 0x3) * (x_thread[1] * 256.0f); + accum += (w[1] & 0x7c) * x_thread[2]; + accum += (w[1] & 0x80) * x_thread[3]; + accum += (w[2] & 0xf) * (x_thread[3] * 256.0f); + accum += (w[2] & 0xf0) * x_thread[4]; + accum += (w[3] & 0x1) * (x_thread[4] * 256.0f); + accum += (w[3] & 0x3e) * x_thread[5]; + accum += (w[3] & 0xc0) * x_thread[6]; + accum += (w[4] & 0x7) * (x_thread[6] * 256.0f); + accum += (w[4] & 0xf8) * x_thread[7]; + } + } + + else if (bits == 6) { + for (int i = 0; i < (N / 4); i++) { + x_thread += 4 * i; + w += 3 * i; + + accum += (w[0] & 0x3f) * x_thread[0]; + + accum += (w[0] & 0xc0) * x_thread[1]; + accum += (w[1] & 0x0f) * (x_thread[1] * 256.0f); + + accum += (w[1] & 0xf0) * x_thread[2]; + accum += (w[2] & 0x03) * (x_thread[2] * 256.0f); + + accum += (w[2] & 0xfc) * x_thread[3]; + } + } + + else if (bits == 8) { + for (int i = 0; i < N; i++) { + accum += x_thread[i] * w[i]; + } + } + + return scale * accum + sum * bias; +} + +template +inline void +qouter(const thread uint8_t* w, U x, U scale, U bias, thread U* result) { + static_assert( + bits == 2 || bits == 3 || bits == 4 || bits == 5 || bits == 6 || + bits == 8, + "Template undefined for bits not in {2, 3, 4, 5, 6, 8}"); + + if (bits == 2) { + U s[4] = {scale, scale / 4.0f, scale / 16.0f, scale / 64.0f}; + for (int i = 0; i < (values_per_thread / 4); i++) { + result[4 * i] += x * (s[0] * (w[i] & 0x03) + bias); + result[4 * i + 1] += x * (s[1] * (w[i] & 0x0c) + bias); + result[4 * i + 2] += x * (s[2] * (w[i] & 0x30) + bias); + result[4 * i + 3] += x * (s[3] * (w[i] & 0xc0) + bias); + } + } + + else if (bits == 3) { + for (int i = 0; i < (values_per_thread / 8); i++) { + uint8_t w0 = w[3 * i]; + uint8_t w1 = w[3 * i + 1]; + uint8_t w2 = w[3 * i + 2]; + + result[8 * i] += x * ((w0 & 0x7) * scale + bias); + result[8 * i + 1] += x * (((w0 & 0x38) >> 3) * scale + bias); + result[8 * i + 2] += + x * ((((w0 & 0xc0) >> 6) + ((w1 & 0x1) << 2)) * scale + bias); + result[8 * i + 3] += x * (((w1 & 0xe) >> 1) * scale + bias); + result[8 * i + 4] += x * (((w1 & 0x70) >> 4) * scale + bias); + result[8 * i + 5] += + x * ((((w1 & 0x80) >> 7) + ((w2 & 0x3) << 1)) * scale + bias); + result[8 * i + 6] += x * (((w2 & 0x1c) >> 2) * scale + bias); + result[8 * i + 7] += x * (((w2 & 0xe0) >> 5) * scale + bias); + } + } + + else if (bits == 4) { + U s[2] = {scale, scale / 16.0f}; + for (int i = 0; i < (values_per_thread / 2); i++) { + result[2 * i] += x * (s[0] * (w[i] & 0x0f) + bias); + result[2 * i + 1] += x * (s[1] * (w[i] & 0xf0) + bias); + } + } + + else if (bits == 5) { + for (int i = 0; i < (values_per_thread / 8); i++) { + uint8_t w0 = w[5 * i]; + uint8_t w1 = w[5 * i + 1]; + uint8_t w2 = w[5 * i + 2]; + uint8_t w3 = w[5 * i + 3]; + uint8_t w4 = w[5 * i + 4]; + result[8 * i] += x * ((w0 & 0x1f) * scale + bias); + result[8 * i + 1] += + x * ((((w0 & 0xe0) >> 5) + ((w1 & 0x3) << 3)) * scale + bias); + result[8 * i + 2] += x * (((w1 & 0x7c) >> 2) * scale + bias); + result[8 * i + 3] += + x * ((((w1 & 0x80) >> 7) + ((w2 & 0xf) << 1)) * scale + bias); + result[8 * i + 4] += + x * ((((w2 & 0xf0) >> 4) + ((w3 & 0x1) << 4)) * scale + bias); + result[8 * i + 5] += x * (((w3 & 0x3e) >> 1) * scale + bias); + result[8 * i + 6] += + x * ((((w3 & 0xc0) >> 6) + ((w4 & 0x7) << 2)) * scale + bias); + result[8 * i + 7] += x * (((w4 & 0xf8) >> 3) * scale + bias); + } + } + + else if (bits == 6) { + for (int i = 0; i < (values_per_thread / 4); i++) { + uint8_t w0 = w[3 * i]; + uint8_t w1 = w[3 * i + 1]; + uint8_t w2 = w[3 * i + 2]; + + result[4 * i] += x * ((w0 & 0x3f) * scale + bias); + result[4 * i + 1] += + x * ((((w0 >> 6) & 0x03) + ((w1 & 0x0f) << 2)) * scale + bias); + result[4 * i + 2] += + x * ((((w1 >> 4) & 0x0f) + ((w2 & 0x03) << 4)) * scale + bias); + result[4 * i + 3] += x * (((w2 >> 2) & 0x3f) * scale + bias); + } + } + + else if (bits == 8) { + for (int i = 0; i < values_per_thread; i++) { + result[i] += x * (scale * w[i] + bias); + } + } +} + +template +inline void +dequantize(const device uint8_t* w, U scale, U bias, threadgroup U* w_local) { + static_assert( + bits == 2 || bits == 3 || bits == 4 || bits == 5 || bits == 6 || + bits == 8, + "Template undefined for bits not in {2, 3, 4, 5, 6, 8}"); + + const float s = float(scale); + const float b = float(bias); + + if (bits == 2) { + float sc[4] = {s, s / 4.0f, s / 16.0f, s / 64.0f}; + for (int i = 0; i < (N / 4); i++) { + w_local[4 * i] = static_cast(sc[0] * (w[i] & 0x03) + b); + w_local[4 * i + 1] = static_cast(sc[1] * (w[i] & 0x0c) + b); + w_local[4 * i + 2] = static_cast(sc[2] * (w[i] & 0x30) + b); + w_local[4 * i + 3] = static_cast(sc[3] * (w[i] & 0xc0) + b); + } + } + + else if (bits == 3) { + for (int i = 0; i < (N / 8); i++) { + w_local += 8 * i; + w += 3 * i; + + w_local[0] = static_cast((w[0] & 0x7) * s + b); + w_local[1] = static_cast(((w[0] & 0x38) >> 3) * s + b); + w_local[2] = + static_cast((((w[0] & 0xc0) >> 6) + ((w[1] & 0x1) << 2)) * s + b); + w_local[3] = static_cast(((w[1] & 0xe) >> 1) * s + b); + w_local[4] = static_cast(((w[1] & 0x70) >> 4) * s + b); + w_local[5] = + static_cast((((w[1] & 0x80) >> 7) + ((w[2] & 0x3) << 1)) * s + b); + w_local[6] = static_cast(((w[2] & 0x1c) >> 2) * s + b); + w_local[7] = static_cast(((w[2] & 0xe0) >> 5) * s + b); + } + } + + else if (bits == 4) { + float sc[2] = {s, s / 16.0f}; + for (int i = 0; i < (N / 2); i++) { + w_local[2 * i] = static_cast(sc[0] * (w[i] & 0x0f) + b); + w_local[2 * i + 1] = static_cast(sc[1] * (w[i] & 0xf0) + b); + } + } + + else if (bits == 5) { + for (int i = 0; i < (N / 8); i++) { + w_local += 8 * i; + w += 5 * i; + + w_local[0] = static_cast((w[0] & 0x1f) * s + b); + w_local[1] = + static_cast((((w[0] & 0xe0) >> 5) + ((w[1] & 0x3) << 3)) * s + b); + w_local[2] = static_cast(((w[1] & 0x7c) >> 2) * s + b); + w_local[3] = + static_cast((((w[1] & 0x80) >> 7) + ((w[2] & 0xf) << 1)) * s + b); + w_local[4] = + static_cast((((w[2] & 0xf0) >> 4) + ((w[3] & 0x1) << 4)) * s + b); + w_local[5] = static_cast(((w[3] & 0x3e) >> 1) * s + b); + w_local[6] = + static_cast((((w[3] & 0xc0) >> 6) + ((w[4] & 0x7) << 2)) * s + b); + w_local[7] = static_cast(((w[4] & 0xf8) >> 3) * s + b); + } + } + + else if (bits == 6) { + for (int i = 0; i < (N / 4); i++) { + w_local += 4 * i; + w += 3 * i; + w_local[0] = static_cast((w[0] & 0x3f) * s + b); + w_local[1] = + static_cast((((w[0] >> 6) & 0x03) + ((w[1] & 0x0f) << 2)) * s + b); + w_local[2] = + static_cast((((w[1] >> 4) & 0x0f) + ((w[2] & 0x03) << 4)) * s + b); + w_local[3] = static_cast(((w[2] >> 2) & 0x3f) * s + b); + } + } + + else if (bits == 8) { + for (int i = 0; i < N; i++) { + w_local[i] = static_cast(s * w[i] + b); + } + } +} + +template < + typename T, + short BROWS, + short BCOLS, + short dst_ld, + short reduction_dim, + short tgp_size, + short group_size, + short bits> +struct QuantizedBlockLoader { + static_assert( + BCOLS <= group_size, + "The group size should be larger than the columns"); + static_assert( + group_size % BCOLS == 0, + "The group size should be divisible by the columns"); + static_assert( + bits == 2 || bits == 3 || bits == 4 || bits == 5 || bits == 6 || + bits == 8, + "Template undefined for bits not in {2, 3, 4, 5, 6, 8}"); + + MLX_MTL_CONST short pack_factor = get_pack_factor(); + MLX_MTL_CONST short bytes_per_pack = get_bytes_per_pack(); + MLX_MTL_CONST short BCOLS_PACKED = BCOLS / pack_factor; + MLX_MTL_CONST short n_reads = + (BCOLS_PACKED * BROWS < tgp_size) ? 1 : (BCOLS_PACKED * BROWS) / tgp_size; + MLX_MTL_CONST short group_steps = group_size / BCOLS; + + const int src_ld; + const int tile_stride; + short group_step_cnt; + const int group_stride; + + const short thread_idx; + const short bi; + const short bj; + + threadgroup T* dst; + const device uint8_t* src; + const device T* scales; + const device T* biases; + + QuantizedBlockLoader( + const device uint8_t* src_, + const device T* scales_, + const device T* biases_, + const int src_ld_, + threadgroup T* dst_, + ushort simd_group_id [[simdgroup_index_in_threadgroup]], + ushort simd_lane_id [[thread_index_in_simdgroup]]) thread + : src_ld(src_ld_), + tile_stride( + reduction_dim ? BCOLS_PACKED* bytes_per_pack + : BROWS * src_ld * bytes_per_pack / pack_factor), + group_step_cnt(0), + group_stride(BROWS* src_ld / group_size), + thread_idx(simd_group_id * 32 + simd_lane_id), + bi(n_reads* thread_idx / BCOLS_PACKED), + bj((n_reads * thread_idx) % BCOLS_PACKED), + dst(dst_ + bi * dst_ld + bj * pack_factor), + src(src_ + bi * src_ld * bytes_per_pack / pack_factor + + bj * bytes_per_pack), + scales(scales_ + bi * src_ld / group_size), + biases(biases_ + bi * src_ld / group_size) {} + + void load_unsafe() const thread { + if (BCOLS_PACKED * BROWS < tgp_size && bi >= BROWS) { + return; + } + + T scale = *scales; + T bias = *biases; + for (int i = 0; i < n_reads; i++) { + dequantize( + src + i * bytes_per_pack, scale, bias, dst + i * pack_factor); + } + } + + void load_safe(short2 src_tile_dim) const thread { + if (BCOLS_PACKED * BROWS < tgp_size && bi >= BROWS) { + return; + } + + if (reduction_dim == 1 && bi >= src_tile_dim.x) { + for (int i = 0; i < n_reads * pack_factor; i++) { + dst[i] = T(0); + } + return; + } + + if (reduction_dim == 0 && bi >= src_tile_dim.y) { + for (int i = 0; i < n_reads * pack_factor; i++) { + dst[i] = T(0); + } + return; + } + + T scale = *scales; + T bias = *biases; + for (int i = 0; i < n_reads; i++) { + dequantize( + (device uint8_t*)(src + i * bytes_per_pack), + scale, + bias, + dst + i * pack_factor); + } + } + + void next() thread { + src += tile_stride; + if (reduction_dim == 1) { + if (group_steps > 1) { + group_step_cnt++; + if (group_step_cnt == group_steps) { + group_step_cnt = 0; + scales++; + biases++; + } + } else { + scales++; + biases++; + } + } else { + scales += group_stride; + biases += group_stride; + } + } +}; + +template < + typename T, + short BROWS, + short BCOLS, + short dst_ld, + short reduction_dim, + short tgp_size, + short bits> +struct QuantizedBlockLoader< + T, + BROWS, + BCOLS, + dst_ld, + reduction_dim, + tgp_size, + 32, + bits> { + MLX_MTL_CONST short group_size = 32; + + static_assert( + BCOLS % group_size == 0, + "The group size should be divisible by the columns"); + static_assert( + bits == 2 || bits == 3 || bits == 4 || bits == 5 || bits == 6 || + bits == 8, + "Template undefined for bits not in {2, 3, 4, 5, 6, 8}"); + + MLX_MTL_CONST short pack_factor = get_pack_factor(); + MLX_MTL_CONST short bytes_per_pack = get_bytes_per_pack(); + MLX_MTL_CONST short BCOLS_PACKED = BCOLS / pack_factor; + MLX_MTL_CONST short n_reads = + (BCOLS_PACKED * BROWS < tgp_size) ? 1 : (BCOLS_PACKED * BROWS) / tgp_size; + MLX_MTL_CONST short n_groups = BCOLS / group_size; + + static_assert( + (BCOLS_PACKED / n_reads) == n_groups, + "Other configurations are not yet supported"); + + const int src_ld; + const int tile_stride; + const int group_stride; + + const short thread_idx; + const short bi; + const short bj; + + const short group_id; + + threadgroup T* dst; + const device uint8_t* src; + const device T* scales; + const device T* biases; + + QuantizedBlockLoader( + const device uint8_t* src_, + const device T* scales_, + const device T* biases_, + const int src_ld_, + threadgroup T* dst_, + ushort simd_group_id [[simdgroup_index_in_threadgroup]], + ushort simd_lane_id [[thread_index_in_simdgroup]]) thread + : src_ld(src_ld_), + tile_stride( + reduction_dim ? BCOLS_PACKED* bytes_per_pack + : BROWS * src_ld * bytes_per_pack / pack_factor), + group_stride(BROWS* src_ld / group_size), + thread_idx(simd_group_id * 32 + simd_lane_id), + bi(n_reads* thread_idx / BCOLS_PACKED), + bj((n_reads * thread_idx) % BCOLS_PACKED), + group_id((bj * pack_factor) / group_size), + dst(dst_ + bi * dst_ld + bj * pack_factor), + src(src_ + bi * src_ld * bytes_per_pack / pack_factor + + bj * bytes_per_pack), + scales(scales_ + bi * src_ld / group_size + group_id), + biases(biases_ + bi * src_ld / group_size + group_id) {} + + void load_unsafe() const thread { + if (BCOLS_PACKED * BROWS < tgp_size && bi >= BROWS) { + return; + } + + T scale = *scales; + T bias = *biases; + for (int i = 0; i < n_reads; i++) { + dequantize( + src + i * bytes_per_pack, scale, bias, dst + i * pack_factor); + } + } + + void load_safe(short2 src_tile_dim) const thread { + if (BCOLS_PACKED * BROWS < tgp_size && bi >= BROWS) { + return; + } + + if (reduction_dim == 1 && bi >= src_tile_dim.x) { + for (int i = 0; i < n_reads * pack_factor; i++) { + dst[i] = T(0); + } + return; + } + + if (reduction_dim == 0 && bi >= src_tile_dim.y) { + for (int i = 0; i < n_reads * pack_factor; i++) { + dst[i] = T(0); + } + return; + } + + T scale = *scales; + T bias = *biases; + for (int i = 0; i < n_reads; i++) { + dequantize( + (device uint8_t*)(src + i * bytes_per_pack), + scale, + bias, + dst + i * pack_factor); + } + } + + void next() thread { + src += tile_stride; + if (reduction_dim == 1) { + // if (group_steps > 1) { + // group_step_cnt++; + // if (group_step_cnt == group_steps) { + // group_step_cnt = 0; + // scales++; + // biases++; + // } + // } else { + scales += n_groups; + biases += n_groups; + // } + } else { + scales += group_stride; + biases += group_stride; + } + } +}; + +template +METAL_FUNC void adjust_matrix_offsets( + const device T*& x, + const device uint32_t*& w, + const device T*& scales, + const device T*& biases, + device T*& y, + int output_stride, + const constant int& x_batch_ndims, + const constant int* x_shape, + const constant int64_t* x_strides, + const constant int& w_batch_ndims, + const constant int* w_shape, + const constant int64_t* w_strides, + const constant int64_t* s_strides, + const constant int64_t* b_strides, + uint3 tid [[threadgroup_position_in_grid]]) { + // Set the input/output matrices + uint32_t x_idx = tid.z; + uint32_t w_idx = tid.z; + if (x_batch_ndims == 1) { + x += x_idx * x_strides[0]; + } else { + x += elem_to_loc(x_idx, x_shape, x_strides, x_batch_ndims); + } + if (w_batch_ndims == 1) { + w += w_idx * w_strides[0]; + scales += w_idx * s_strides[0]; + biases += w_idx * b_strides[0]; + } else { + ulong3 idx = elem_to_loc_broadcast( + w_idx, w_shape, w_strides, s_strides, b_strides, w_batch_ndims); + w += idx.x; + scales += idx.y; + biases += idx.z; + } + y += tid.z * output_stride; +} + +template +METAL_FUNC void adjust_matrix_offsets( + const device T*& x, + const device uint32_t*& w, + const device T*& scales, + const device T*& biases, + const device uint32_t* lhs_indices, + const device uint32_t* rhs_indices, + device T*& y, + int output_stride, + const constant int& batch_ndims, + const constant int* batch_shape, + const constant int64_t* lhs_strides, + const constant int64_t* rhs_strides, + const constant int& x_batch_ndims, + const constant int* x_shape, + const constant int64_t* x_strides, + const constant int& w_batch_ndims, + const constant int* w_shape, + const constant int64_t* w_strides, + const constant int64_t* s_strides, + const constant int64_t* b_strides, + uint3 tid [[threadgroup_position_in_grid]]) { + // Set the input/output matrices + uint32_t x_idx; + uint32_t w_idx; + if (batch_ndims == 1) { + x_idx = lhs_indices[tid.z * lhs_strides[0]]; + w_idx = rhs_indices[tid.z * rhs_strides[0]]; + } else { + ulong2 idx = elem_to_loc_broadcast( + tid.z, batch_shape, lhs_strides, rhs_strides, batch_ndims); + x_idx = lhs_indices[idx.x]; + w_idx = rhs_indices[idx.y]; + } + if (x_batch_ndims == 1) { + x += x_idx * x_strides[0]; + } else { + x += elem_to_loc(x_idx, x_shape, x_strides, x_batch_ndims); + } + if (w_batch_ndims == 1) { + w += w_idx * w_strides[0]; + scales += w_idx * s_strides[0]; + biases += w_idx * b_strides[0]; + } else { + ulong3 idx = elem_to_loc_broadcast( + w_idx, w_shape, w_strides, s_strides, b_strides, w_batch_ndims); + w += idx.x; + scales += idx.y; + biases += idx.z; + } + y += tid.z * output_stride; +} + +template < + typename T, + const int group_size, + const int bits, + const bool aligned_N, + const int BM = 64, + const int BK = 64, + const int BN = 64, + const int WM = 2, + const int WN = 2> +METAL_FUNC void qmm_t_nax_tgp_impl( + const device uint32_t* w, + const device T* scales, + const device T* biases, + const device T* x, + device T* y, + threadgroup T* Ws, + const constant int& K, + const constant int& N, + const constant int& M, + uint3 tid [[threadgroup_position_in_grid]], + uint lid [[thread_index_in_threadgroup]], + uint simd_gid [[simdgroup_index_in_threadgroup]], + uint simd_lid [[thread_index_in_simdgroup]]) { + static_assert(BK >= SIMD_SIZE, "BK should be larger than SIMD_SIZE"); + static_assert(BK % SIMD_SIZE == 0, "BK should be divisible by SIMD_SIZE"); + + (void)lid; + + constexpr int pack_factor = get_pack_factor(); + constexpr int bytes_per_pack = get_bytes_per_pack(); + + constexpr int BK_padded = (BK + 16 / sizeof(T)); + + using loader_w_t = QuantizedBlockLoader< + T, + BN, + BK, + BK_padded, + 1, + WM * WN * SIMD_SIZE, + group_size, + bits>; + + // Set the block + const int K_w = K * bytes_per_pack / pack_factor; + const int K_g = K / group_size; + const int y_row = tid.y * BM; + const int y_col = tid.x * BN; + + auto wl = (const device uint8_t*)w; + + x += y_row * static_cast(K); + wl += y_col * K_w; + scales += y_col * K_g; + biases += y_col * K_g; + y += y_row * static_cast(N) + y_col; + + // Make the weight loader + loader_w_t loader_w(wl, scales, biases, K, Ws, simd_gid, simd_lid); + + constexpr short SM = BM / WM; + constexpr short SN = BN / WN; + constexpr short SK = 32; + + constexpr short TM = SM / 16; + constexpr short TN = SN / 16; + constexpr short TK = SK / 16; + + const short tm = SM * (simd_gid / WN); + const short tn = SN * (simd_gid % WN); + + constexpr bool transpose_a = false; + constexpr bool transpose_b = true; + + const short sgp_sm = min(int(SM), M - (y_row + tm)); + const bool is_unaligned_sm = (sgp_sm != SM); + + const short sgp_sn = aligned_N ? SN : min(int(SN), N - (y_col + tn)); + + const short tgp_bn = aligned_N ? BN : min(BN, int(N - (y_col))); + const bool is_unaligned_bn = aligned_N ? false : (tgp_bn != BN); + + using AccumType = float; + + NAXTile Dtile; + Dtile.clear(); + + x += tm * K; + + dispatch_bool(!is_unaligned_sm, [&](auto kAlignedM) { + dispatch_bool(aligned_N || !is_unaligned_bn, [&](auto kAlignedN) { + for (int k = 0; k < K; k += BK) { + threadgroup_barrier(mem_flags::mem_threadgroup); + if constexpr (kAlignedN.value) { + loader_w.load_unsafe(); + } else { + loader_w.load_safe(short2(BK, tgp_bn)); + } + + threadgroup_barrier(mem_flags::mem_threadgroup); + + STEEL_PRAGMA_NO_UNROLL + for (int kk1 = 0; kk1 < BK; kk1 += SK) { + NAXTile Atile; + NAXTile Btile; + + volatile int compiler_barrier; + + if constexpr (kAlignedM.value) { + Atile.load(x + kk1, K); + } else { + Atile.load_safe(x + kk1, K, short2(SK, sgp_sm)); + } + + Btile.template load(Ws + tn * BK_padded + kk1); + + tile_matmad_nax( + Dtile, + Atile, + metal::bool_constant{}, + Btile, + metal::bool_constant{}); + + (void)compiler_barrier; + } + + x += BK; + loader_w.next(); + } + + // Store results to device memory + threadgroup_barrier(mem_flags::mem_threadgroup); + + if constexpr (kAlignedM.value && kAlignedN.value) { + Dtile.store(y + tm * N + tn, N); + } else if (kAlignedM.value && sgp_sn == SN) { + Dtile.store(y + tm * N + tn, N); + } else { + Dtile.store_safe(y + tm * N + tn, N, short2(sgp_sn, sgp_sm)); + } + }); + }); +} + +template < + typename T, + const int group_size, + const int bits, + const int BM = 64, + const int BK = 64, + const int BN = 64, + const int WM = 2, + const int WN = 2> +METAL_FUNC void qmm_n_nax_tgp_impl( + const device uint32_t* w, + const device T* scales, + const device T* biases, + const device T* x, + device T* y, + threadgroup T* Ws, + const constant int& K, + const constant int& N, + const constant int& M, + uint3 tid [[threadgroup_position_in_grid]], + uint lid [[thread_index_in_threadgroup]], + uint simd_gid [[simdgroup_index_in_threadgroup]], + uint simd_lid [[thread_index_in_simdgroup]]) { + (void)lid; + + static_assert(BK >= SIMD_SIZE, "BK should be larger than SIMD_SIZE"); + static_assert(BK % SIMD_SIZE == 0, "BK should be divisible by SIMD_SIZE"); + + constexpr int pack_factor = get_pack_factor(); + constexpr int bytes_per_pack = get_bytes_per_pack(); + + constexpr int BN_padded = (BN + 16 / sizeof(T)); + + using loader_w_t = QuantizedBlockLoader< + T, + BK, + BN, + BN_padded, + 0, + WM * WN * SIMD_SIZE, + group_size, + bits>; + + // Set the block + const int y_row = tid.y * BM; + const int y_col = tid.x * BN; + + auto wl = (const device uint8_t*)w; + + // Here w is [K, N]: packed and group-quantized along N, with row stride N. + x += y_row * static_cast(K); + wl += y_col * bytes_per_pack / pack_factor; + scales += y_col / group_size; + biases += y_col / group_size; + y += y_row * static_cast(N) + y_col; + + // Make the weight loader + loader_w_t loader_w(wl, scales, biases, N, Ws, simd_gid, simd_lid); + + constexpr short SM = BM / WM; + constexpr short SN = BN / WN; + constexpr short SK = 32; + + constexpr short TM = SM / 16; + constexpr short TN = SN / 16; + constexpr short TK = SK / 16; + + const short tm = SM * (simd_gid / WN); + const short tn = SN * (simd_gid % WN); + + const short sgp_sm = min(int(SM), M - (y_row + tm)); + + const short ldb_tgp = BN_padded; + + constexpr bool transpose_a = false; + constexpr bool transpose_b = false; + + using AccumType = float; + + NAXTile Dtile; + Dtile.clear(); + + x += tm * K; + + for (int k = 0; k < K; k += BK) { + threadgroup_barrier(mem_flags::mem_threadgroup); + loader_w.load_unsafe(); + threadgroup_barrier(mem_flags::mem_threadgroup); + + STEEL_PRAGMA_NO_UNROLL + for (int kk1 = 0; kk1 < BK; kk1 += SK) { + NAXTile Atile; + NAXTile Btile; + + volatile int compiler_barrier; + + if (sgp_sm == SM) { + Atile.load(x + kk1, K); + } else { + Atile.load_safe(x + kk1, K, short2(SK, sgp_sm)); + } + + Btile.template load(Ws + tn + kk1 * ldb_tgp); + + tile_matmad_nax( + Dtile, + Atile, + metal::bool_constant{}, + Btile, + metal::bool_constant{}); + + (void)compiler_barrier; + } + + x += BK; + loader_w.next(); + } + + // Store results to device memory + threadgroup_barrier(mem_flags::mem_threadgroup); + + if (sgp_sm == SM) { + Dtile.store(y + tm * N + tn, N); + } else { + Dtile.store_safe(y + tm * N + tn, N, short2(SN, sgp_sm)); + } +} + +template < + typename T, + const int group_size, + const int bits, + const bool aligned_N, + const bool batched, + const int BM = 64, + const int BK = 32, + const int BN = 64, + const int WM = 2, + const int WN = 2> +[[kernel]] void affine_qmm_t_nax( + const device uint32_t* w [[buffer(0)]], + const device T* scales [[buffer(1)]], + const device T* biases [[buffer(2)]], + const device T* x [[buffer(3)]], + device T* y [[buffer(4)]], + const constant int& K [[buffer(5)]], + const constant int& N [[buffer(6)]], + const constant int& M [[buffer(7)]], + const constant int& x_batch_ndims [[buffer(8)]], + const constant int* x_shape [[buffer(9)]], + const constant int64_t* x_strides [[buffer(10)]], + const constant int& w_batch_ndims [[buffer(11)]], + const constant int* w_shape [[buffer(12)]], + const constant int64_t* w_strides [[buffer(13)]], + const constant int64_t* s_strides [[buffer(14)]], + const constant int64_t* b_strides [[buffer(15)]], + uint3 tid [[threadgroup_position_in_grid]], + uint lid [[thread_index_in_threadgroup]], + uint simd_gid [[simdgroup_index_in_threadgroup]], + uint simd_lid [[thread_index_in_simdgroup]]) { + (void)lid; + + constexpr int BK_padded = (BK + 16 / sizeof(T)); + + threadgroup T Ws[BN * BK_padded]; + + if (batched) { + adjust_matrix_offsets( + x, + w, + scales, + biases, + y, + M * N, + x_batch_ndims, + x_shape, + x_strides, + w_batch_ndims, + w_shape, + w_strides, + s_strides, + b_strides, + tid); + } + qmm_t_nax_tgp_impl( + w, scales, biases, x, y, Ws, K, N, M, tid, lid, simd_gid, simd_lid); +} + +template < + typename T, + const int group_size, + const int bits, + const bool batched, + const int BM = 64, + const int BK = 64, + const int BN = 64, + const int WM = 2, + const int WN = 2> +[[kernel]] void affine_qmm_n_nax( + const device uint32_t* w [[buffer(0)]], + const device T* scales [[buffer(1)]], + const device T* biases [[buffer(2)]], + const device T* x [[buffer(3)]], + device T* y [[buffer(4)]], + const constant int& K [[buffer(5)]], + const constant int& N [[buffer(6)]], + const constant int& M [[buffer(7)]], + const constant int& x_batch_ndims [[buffer(8)]], + const constant int* x_shape [[buffer(9)]], + const constant int64_t* x_strides [[buffer(10)]], + const constant int& w_batch_ndims [[buffer(11)]], + const constant int* w_shape [[buffer(12)]], + const constant int64_t* w_strides [[buffer(13)]], + const constant int64_t* s_strides [[buffer(14)]], + const constant int64_t* b_strides [[buffer(15)]], + uint3 tid [[threadgroup_position_in_grid]], + uint lid [[thread_index_in_threadgroup]], + uint simd_gid [[simdgroup_index_in_threadgroup]], + uint simd_lid [[thread_index_in_simdgroup]]) { + (void)lid; + + constexpr int BN_padded = (BN + 16 / sizeof(T)); + + threadgroup T Ws[BK * BN_padded]; + + if (batched) { + adjust_matrix_offsets( + x, + w, + scales, + biases, + y, + M * N, + x_batch_ndims, + x_shape, + x_strides, + w_batch_ndims, + w_shape, + w_strides, + s_strides, + b_strides, + tid); + } + + qmm_n_nax_tgp_impl( + w, scales, biases, x, y, Ws, K, N, M, tid, lid, simd_gid, simd_lid); +} + +template < + typename T, + const int group_size, + const int bits, + const bool aligned_N, + const int BM = 64, + const int BK = 64, + const int BN = 64, + const int WM = 2, + const int WN = 2> +[[kernel]] void affine_gather_qmm_t_nax( + const device uint32_t* w [[buffer(0)]], + const device T* scales [[buffer(1)]], + const device T* biases [[buffer(2)]], + const device T* x [[buffer(3)]], + const device uint32_t* lhs_indices [[buffer(4)]], + const device uint32_t* rhs_indices [[buffer(5)]], + device T* y [[buffer(6)]], + const constant int& K [[buffer(7)]], + const constant int& N [[buffer(8)]], + const constant int& M [[buffer(9)]], + const constant int& x_batch_ndims [[buffer(10)]], + const constant int* x_shape [[buffer(11)]], + const constant int64_t* x_strides [[buffer(12)]], + const constant int& w_batch_ndims [[buffer(13)]], + const constant int* w_shape [[buffer(14)]], + const constant int64_t* w_strides [[buffer(15)]], + const constant int64_t* s_strides [[buffer(16)]], + const constant int64_t* b_strides [[buffer(17)]], + const constant int& batch_ndims [[buffer(18)]], + const constant int* batch_shape [[buffer(19)]], + const constant int64_t* lhs_strides [[buffer(20)]], + const constant int64_t* rhs_strides [[buffer(21)]], + uint3 tid [[threadgroup_position_in_grid]], + uint lid [[thread_index_in_threadgroup]], + uint simd_gid [[simdgroup_index_in_threadgroup]], + uint simd_lid [[thread_index_in_simdgroup]]) { + (void)lid; + + constexpr int BK_padded = (BK + 16 / sizeof(T)); + + threadgroup T Ws[BN * BK_padded]; + + adjust_matrix_offsets( + x, + w, + scales, + biases, + lhs_indices, + rhs_indices, + y, + M * N, + batch_ndims, + batch_shape, + lhs_strides, + rhs_strides, + x_batch_ndims, + x_shape, + x_strides, + w_batch_ndims, + w_shape, + w_strides, + s_strides, + b_strides, + tid); + qmm_t_nax_tgp_impl( + w, scales, biases, x, y, Ws, K, N, M, tid, lid, simd_gid, simd_lid); +} + +template < + typename T, + const int group_size, + const int bits, + const int BM = 64, + const int BK = 64, + const int BN = 64, + const int WM = 2, + const int WN = 2> +[[kernel]] void affine_gather_qmm_n_nax( + const device uint32_t* w [[buffer(0)]], + const device T* scales [[buffer(1)]], + const device T* biases [[buffer(2)]], + const device T* x [[buffer(3)]], + const device uint32_t* lhs_indices [[buffer(4)]], + const device uint32_t* rhs_indices [[buffer(5)]], + device T* y [[buffer(6)]], + const constant int& K [[buffer(7)]], + const constant int& N [[buffer(8)]], + const constant int& M [[buffer(9)]], + const constant int& x_batch_ndims [[buffer(10)]], + const constant int* x_shape [[buffer(11)]], + const constant int64_t* x_strides [[buffer(12)]], + const constant int& w_batch_ndims [[buffer(13)]], + const constant int* w_shape [[buffer(14)]], + const constant int64_t* w_strides [[buffer(15)]], + const constant int64_t* s_strides [[buffer(16)]], + const constant int64_t* b_strides [[buffer(17)]], + const constant int& batch_ndims [[buffer(18)]], + const constant int* batch_shape [[buffer(19)]], + const constant int64_t* lhs_strides [[buffer(20)]], + const constant int64_t* rhs_strides [[buffer(21)]], + uint3 tid [[threadgroup_position_in_grid]], + uint lid [[thread_index_in_threadgroup]], + uint simd_gid [[simdgroup_index_in_threadgroup]], + uint simd_lid [[thread_index_in_simdgroup]]) { + (void)lid; + + constexpr int BN_padded = (BN + 16 / sizeof(T)); + + threadgroup T Ws[BK * BN_padded]; + + adjust_matrix_offsets( + x, + w, + scales, + biases, + lhs_indices, + rhs_indices, + y, + M * N, + batch_ndims, + batch_shape, + lhs_strides, + rhs_strides, + x_batch_ndims, + x_shape, + x_strides, + w_batch_ndims, + w_shape, + w_strides, + s_strides, + b_strides, + tid); + qmm_n_nax_tgp_impl( + w, scales, biases, x, y, Ws, K, N, M, tid, lid, simd_gid, simd_lid); +} + +template < + typename T, + int group_size, + int bits, + int BM, + int BN, + int BK, + int WM, + int WN, + bool transpose> +[[kernel]] void affine_gather_qmm_rhs_nax( + const device T* x [[buffer(0)]], + const device uint32_t* w [[buffer(1)]], + const device T* scales [[buffer(2)]], + const device T* biases [[buffer(3)]], + const device uint32_t* indices [[buffer(4)]], + device T* y [[buffer(5)]], + const constant int& M [[buffer(6)]], + const constant int& N [[buffer(7)]], + const constant int& K [[buffer(8)]], + uint3 tid [[threadgroup_position_in_grid]], + uint simd_group_id [[simdgroup_index_in_threadgroup]], + uint simd_lane_id [[thread_index_in_simdgroup]]) { + constexpr int pack_factor = get_pack_factor(); + constexpr int bytes_per_pack = get_bytes_per_pack(); + constexpr int BK_padded = (BK + 16 / sizeof(T)); + constexpr int BN_padded = (BN + 16 / sizeof(T)); + + using loader_w_t = QuantizedBlockLoader< + T, + transpose ? BN : BK, + transpose ? BK : BN, + transpose ? BK_padded : BN_padded, + transpose, + WM * WN * SIMD_SIZE, + group_size, + bits>; + + threadgroup T Ws[transpose ? BN * BK_padded : BK * BN_padded]; + + // Compute the block + const int K_w = K * bytes_per_pack / pack_factor; + const int K_g = K / group_size; + const int N_w = N * bytes_per_pack / pack_factor; + const int N_g = N / group_size; + const int K_it = K / BK; + const size_t stride_w = transpose ? N * K_w : K * N_w; + const size_t stride_s = transpose ? N * K_g : K * N_g; + const int y_row = tid.y * BM; + const int y_col = tid.x * BN; + const size_t y_row_long = size_t(y_row); + const size_t y_col_long = size_t(y_col); + + // Prepare threadgroup bounds + const short tgp_bm = align_M ? BM : short(min(BM, M - y_row)); + const short tgp_bn = align_N ? BN : short(min(BN, N - y_col)); + + // Calculate the final tiles in the case that K is not aligned + const int k_remain = K - K_it * BK; + const short2 tile_w = + transpose ? short2(k_remain, tgp_bn) : short2(tgp_bn, k_remain); + + // Move x and output to the correct block + auto wl = (const device uint8_t*)w; + x += y_row_long * K; + y += y_row_long * N + y_col_long; + wl += transpose ? y_col_long * K_w : y_col * bytes_per_pack / pack_factor; + scales += transpose ? y_col_long * K_g : y_col / group_size; + biases += transpose ? y_col_long * K_g : y_col / group_size; + + constexpr short SM = BM / WM; + constexpr short SN = BN / WN; + constexpr short SK = 32; + + constexpr short TM = SM / 16; + constexpr short TN = SN / 16; + constexpr short TK = SK / 16; + + const short tm = SM * (simd_group_id / WN); + const short tn = SN * (simd_group_id % WN); + + const short sgp_sm = + align_M ? SM : min(SM, short(max(0, (M - (y_row + tm))))); + const short sgp_sn = + align_N ? SN : min(SN, short(max(0, (N - (y_col + tn))))); + + const bool is_unaligned_sm = align_M ? false : (sgp_sm != SM); + const bool is_unaligned_bn = align_N ? false : (tgp_bn != BN); + + constexpr short BR = transpose ? TN : TK; + constexpr short BC = transpose ? TK : TN; + + using AccumType = float; + + // Do as many matmuls as necessary + uint32_t index; + short offset; + uint32_t index_next = indices[y_row]; + short offset_next = 0; + int n = 0; + while (n < tgp_bm) { + n++; + offset = offset_next; + index = index_next; + offset_next = tgp_bm; + for (; n < tgp_bm; n++) { + if (indices[y_row + n] != index) { + offset_next = n; + index_next = indices[y_row + n]; + break; + } + } + threadgroup_barrier(mem_flags::mem_none); + + const short m_lo_lim = min(int(sgp_sm), max(0, offset - tm)); + const short m_hi_lim = min(int(sgp_sm), max(0, offset_next - tm)); + const bool sg_active = m_hi_lim > m_lo_lim; + + NAXTile Dtile; + Dtile.clear(); + + const device T* xn = x + tm * K; + + // Prepare threadgroup loading operations + thread loader_w_t loader_w( + wl + index * stride_w, + scales + index * stride_s, + biases + index * stride_s, + transpose ? K : N, + Ws, + simd_group_id, + simd_lane_id); + + dispatch_bool(align_M || !is_unaligned_sm, [&](auto kAlignedM) { + dispatch_bool(align_N || !is_unaligned_bn, [&](auto kAlignedN) { + for (int k = 0; k < K_it; k++) { + threadgroup_barrier(mem_flags::mem_threadgroup); + if constexpr (kAlignedN.value) { + loader_w.load_unsafe(); + } else { + loader_w.load_safe( + transpose ? short2(BK, tgp_bn) : short2(tgp_bn, BK)); + } + + threadgroup_barrier(mem_flags::mem_threadgroup); + + STEEL_PRAGMA_NO_UNROLL + for (int kk1 = 0; kk1 < BK; kk1 += SK) { + if (sg_active) { + NAXTile Atile; + NAXTile Btile; + + volatile int compiler_barrier; + + if constexpr (kAlignedM.value) { + Atile.load(xn + kk1, K); + } else { + Atile.load_safe(xn + kk1, K, short2(SK, sgp_sm)); + } + + if constexpr (transpose) { + Btile.template load(Ws + tn * BK_padded + kk1); + } else { + Btile.template load(Ws + tn + kk1 * BN_padded); + } + + tile_matmad_nax( + Dtile, + Atile, + metal::bool_constant{}, + Btile, + metal::bool_constant{}); + + (void)compiler_barrier; + } + } + + xn += BK; + loader_w.next(); + } + + if (!align_K) { + threadgroup_barrier(mem_flags::mem_threadgroup); + loader_w.load_safe(tile_w); + threadgroup_barrier(mem_flags::mem_threadgroup); + + STEEL_PRAGMA_NO_UNROLL + for (int kk1 = 0; kk1 < BK; kk1 += SK) { + if (sg_active) { + NAXTile Atile; + NAXTile Btile; + + volatile int compiler_barrier; + + const short psk = min(int(SK), max(0, (BK - kk1))); + Atile.load_safe(xn + kk1, K, short2(psk, sgp_sm)); + + if constexpr (transpose) { + Btile.template load(Ws + tn * BK_padded + kk1); + } else { + Btile.template load(Ws + tn + kk1 * BN_padded); + } + + tile_matmad_nax( + Dtile, + Atile, + metal::bool_constant{}, + Btile, + metal::bool_constant{}); + + (void)compiler_barrier; + } + } + } + + threadgroup_barrier(mem_flags::mem_threadgroup); + + // Store results to device memory + if constexpr (kAlignedN.value) { + if (m_lo_lim == 0 && m_hi_lim == SM) { + Dtile.store(y + tm * N + tn, N); + } else { + Dtile.store_slice( + y + tm * N + tn, N, short2(0, m_lo_lim), short2(SN, m_hi_lim)); + } + } else { + Dtile.store_slice( + y + tm * N + tn, + N, + short2(0, m_lo_lim), + short2(sgp_sn, m_hi_lim)); + } + }); + }); + } +} +struct Sigmoid { + template + T operator()(T x) thread { + auto y = 1 / (1 + metal::exp(metal::abs(x))); + return (x < 0) ? y : 1 - y; + } +}; +struct Multiply { + template + T operator()(T x, T y) thread { + return x * y; + } +}; +using namespace mlx::steel; diff --git a/src/engine/metal/qwen_mtplx.rs b/src/engine/metal/qwen_mtplx.rs index a41e3ad..6fc3439 100644 --- a/src/engine/metal/qwen_mtplx.rs +++ b/src/engine/metal/qwen_mtplx.rs @@ -41,11 +41,14 @@ mod issue108; mod issue109; #[cfg(test)] mod issue110; +#[cfg(test)] +mod issue112_bench; mod linear; mod load; mod mlp; mod model; mod moe; +mod moe_sorted; mod mtp; mod ngram; mod ngram_sidecar; @@ -1200,7 +1203,7 @@ fn gather_bf16_broadcast( let lhs_strides = lhs_strides.map(|d| d as i64); let rhs_strides = rhs_strides.map(|d| d as i64); - gather_bf16_layout( + gather_layout( [ tensor(0, w).input(elements[0]), tensor(1, s).input(elements[1]), @@ -1210,6 +1213,7 @@ fn gather_bf16_broadcast( tensor(5, rhs).input(elements[5]), tensor(6, y).output(elements[6]), ], + array::Dtype::BF16, [m, n, k, experts, routes, routes], [bits, group], sorted, @@ -1232,8 +1236,10 @@ fn gather_bf16_broadcast( /// Shared original GatherQMM dispatch; array batch strides are passed verbatim, /// while the two broadcast index layouts have jointly collapsed dimensions. -fn gather_bf16_layout( +#[allow(clippy::too_many_arguments)] // Original GatherQMM ABI and array layouts. +fn gather_layout( bindings: [Binding<'_>; 7], + dtype: array::Dtype, [m, n, k, experts, routes, sorted_rows]: [u32; 6], [bits, group]: [u32; 2], sorted: bool, @@ -1248,7 +1254,12 @@ fn gather_bf16_layout( rhs_strides, ]: [&[i64]; 6], ) -> Result<(), String> { - let suffix = format!("bfloat16_t_gs_{group}_b_{bits}"); + let ty = match dtype { + array::Dtype::BF16 => "bfloat16_t", + array::Dtype::F16 => "float16_t", + _ => return Err("GatherQMM dtype unsupported".into()), + }; + let suffix = format!("{ty}_gs_{group}_b_{bits}"); if m == 1 && routes >= 16 && sorted && routes / experts >= 4 { let (bm, bn, bk, wm, wn) = if nax { ( diff --git a/src/engine/metal/qwen_mtplx/binding.rs b/src/engine/metal/qwen_mtplx/binding.rs index ebd0bfd..48f9816 100644 --- a/src/engine/metal/qwen_mtplx/binding.rs +++ b/src/engine/metal/qwen_mtplx/binding.rs @@ -438,6 +438,7 @@ impl Bank { policy: model::CompilePolicy, fused_moe_decode: bool, fused_moe_verify: bool, + sorted_gather: bool, ) -> Result, String> { let mut bind = Bind { bank: self, @@ -445,6 +446,7 @@ impl Bank { order: Vec::new(), fused_moe_decode, fused_moe_verify, + sorted_gather, }; let embedding = bind.linear("language_model.model.embed_tokens")?; let layers = self @@ -503,6 +505,7 @@ struct Bind<'a> { order: Vec, fused_moe_decode: bool, fused_moe_verify: bool, + sorted_gather: bool, } #[test] @@ -566,7 +569,12 @@ fn mtplx_installed_module_binding_matches_reference() { "no eager parameter evaluation" ); let mut model = bank - .bind(model::CompilePolicy::from_values(None, None), true, true) + .bind( + model::CompilePolicy::from_values(None, None), + true, + true, + true, + ) .unwrap(); assert_eq!(case["mask"], order["mask"]); assert_eq!(case["mtp"], order["mtp"]); @@ -687,7 +695,12 @@ fn mtplx_installed_module_binding_matches_reference() { .all(|(_, a)| !a.has_data()) ); let mut owned = BoundModel::try_new(bank, |bank| { - bank.bind(model::CompilePolicy::from_values(None, None), true, true) + bank.bind( + model::CompilePolicy::from_values(None, None), + true, + true, + true, + ) }) .unwrap(); let module_address = std::ptr::from_ref(owned.borrow_dependent()).addr(); @@ -705,19 +718,29 @@ fn mtplx_installed_module_binding_matches_reference() { let extra = bank.parameters["language_model.model.layers.0.linear_attn.A_log"].clone(); bank.parameters.insert("unexpected.weight".into(), extra); assert!( - bank.bind(model::CompilePolicy::from_values(None, None), true, true) - .err() - .unwrap() - .contains("unbound checkpoint parameters") + bank.bind( + model::CompilePolicy::from_values(None, None), + true, + true, + true + ) + .err() + .unwrap() + .contains("unbound checkpoint parameters") ); bank.parameters.remove("unexpected.weight"); bank.parameters .remove("language_model.model.layers.0.linear_attn.norm.weight"); assert!( - bank.bind(model::CompilePolicy::from_values(None, None), true, true) - .err() - .unwrap() - .contains("missing parameter") + bank.bind( + model::CompilePolicy::from_values(None, None), + true, + true, + true + ) + .err() + .unwrap() + .contains("missing parameter") ); eprintln!( "binding metadata, module recipes, all-parameter coverage, MTP norms and SSD table lifecycle exact" @@ -938,6 +961,7 @@ impl<'a> Bind<'a> { normalize: c.norm_topk_prob, fused_decode: self.fused_moe_decode, fused_verify: self.fused_moe_verify, + sorted_gather: self.sorted_gather, }; let attn_hyper = self.hyper(&format!("{p}.attn_hyper_connection"), true)?; let mlp_hyper = self.hyper(&format!("{p}.mlp_hyper_connection"), true)?; diff --git a/src/engine/metal/qwen_mtplx/compile_graph.rs b/src/engine/metal/qwen_mtplx/compile_graph.rs index ee74f91..207a334 100644 --- a/src/engine/metal/qwen_mtplx/compile_graph.rs +++ b/src/engine/metal/qwen_mtplx/compile_graph.rs @@ -565,10 +565,10 @@ fn equivalent_operation(a: &Operation, b: &Operation, x: &Array, y: &Array) -> b | (AffineQuantize { bits: a, group: b }, AffineQuantize { bits: x, group: y }) | (AffineDequantize { bits: a, group: b }, AffineDequantize { bits: x, group: y }) | ( - GatherQmmBf16 { + GatherQmm { bits: a, group: b, .. }, - GatherQmmBf16 { + GatherQmm { bits: x, group: y, .. }, ) => (a, b) == (x, y), diff --git a/src/engine/metal/qwen_mtplx/decoder.rs b/src/engine/metal/qwen_mtplx/decoder.rs index f23e020..3275179 100644 --- a/src/engine/metal/qwen_mtplx/decoder.rs +++ b/src/engine/metal/qwen_mtplx/decoder.rs @@ -299,6 +299,7 @@ fn mtplx_decoder_connected_attention_and_moe_advance_caches() { shared_gate: quantized(1, 2560), topk: 1, normalize: true, + sorted_gather: true, fused_decode: false, fused_verify: false, } diff --git a/src/engine/metal/qwen_mtplx/execution.rs b/src/engine/metal/qwen_mtplx/execution.rs index 5da28f3..10ae64c 100644 --- a/src/engine/metal/qwen_mtplx/execution.rs +++ b/src/engine/metal/qwen_mtplx/execution.rs @@ -313,6 +313,7 @@ impl Execution { ), flag("MTPLX_FUSED_MOE_DECODE"), flag("MTPLX_FUSED_MOE_VERIFY"), + super::policy::sorted_gather_enabled(get), ) })?; if !lazy { diff --git a/src/engine/metal/qwen_mtplx/issue110.rs b/src/engine/metal/qwen_mtplx/issue110.rs index 329c777..3f9fbc7 100644 --- a/src/engine/metal/qwen_mtplx/issue110.rs +++ b/src/engine/metal/qwen_mtplx/issue110.rs @@ -44,7 +44,7 @@ fn unit_gather(rows: i32, streams: &Streams) -> Array { .unwrap(), ) .unwrap(); - linear::guarded_gather_qmm_bf16( + linear::guarded_gather_qmm( &x, [&w, &s, &b], [None, Some(&rhs)], @@ -141,7 +141,7 @@ fn issue110_actual_projection_rows_match_oracle() { ) .unwrap() }); - let out = linear::guarded_gather_qmm_bf16( + let out = linear::guarded_gather_qmm( &x, [&layer[0], &layer[1], &layer[2]], [lhs.as_ref(), Some(&rhs)], @@ -176,7 +176,7 @@ pub(super) fn record(rows: i32, pad: i32, k: i32, n: i32) { #[test] #[ignore = "full installed model and large partial chunks; serial memory supervisor required"] -fn issue110_large_cold_and_warm_prefill() { +pub(super) fn issue110_large_cold_and_warm_prefill() { assert_eq!( std::env::var("MTPLX_GDN_BOUNDARY_TAIL_INTERVAL").as_deref(), Ok("0") diff --git a/src/engine/metal/qwen_mtplx/issue112_bench.rs b/src/engine/metal/qwen_mtplx/issue112_bench.rs new file mode 100644 index 0000000..c61abf8 --- /dev/null +++ b/src/engine/metal/qwen_mtplx/issue112_bench.rs @@ -0,0 +1,180 @@ +//! Paired, serial installed-model prefill timings; state reads follow timing. +use super::execution::Execution; +use super::sampling::SamplerConfig; +use super::session_cache::{DecodeOptions, TurnProgress}; +use std::cell::Cell; +use std::time::Instant; + +#[test] +#[ignore = "full installed model; serial memory supervisor and explicit output directory"] +fn issue112_paired_prefill() { + let root = std::path::PathBuf::from(std::env::var_os("DS4_QWEN38_ARTIFACTS").unwrap()); + let directory = std::path::PathBuf::from(std::env::var_os("DS4_ISSUE112_DIR").unwrap()); + std::fs::create_dir_all(&directory).unwrap(); + let repeats = std::env::var("DS4_ISSUE112_REPEATS") + .ok() + .map(|n| n.parse::().unwrap()) + .unwrap_or(3); + let settings = crate::settings::effective_settings( + crate::model::ModelChoice::Qwen38FlashNext, + &crate::settings::GenerationPreferences { + context_tokens: 16384, + max_generated_tokens: 1, + temperature: Some(0.), + ..Default::default() + }, + &crate::settings::RuntimePreferences::default(), + root.parent().unwrap(), + ) + .unwrap(); + let (mut execution, mut options) = Execution::open(&settings.engine).unwrap(); + let sampler = SamplerConfig { + temperature: 0., + ..Default::default() + }; + options.sampler = sampler; + options.draft_sampler = sampler; + options.prefill.return_hidden = false; + options.decode = DecodeOptions::Ar(super::ar::Options { + max_tokens: 1, + seed: 1, + stop_tokens: &[], + sync_eval: false, + return_hidden: false, + capture_final_state: true, + }); + options.store_min_suffix = None; + let tokens = |len: usize| { + (0..len) + .map(|i| [9707, 11, 1075, 374, 264, 1092, 13][i % 7]) + .collect::>() + }; + for chunk in [2048, 4096] { + options.prefill.chunk_size = Some(chunk); + for rep in 0..repeats { + let mut prompt = tokens(4096); + let mut saved = None; + for phase in ["cold", "warm"] { + let start = Instant::now(); + let ttft = Cell::new(None); + let out = execution + .session_turn( + &prompt, + saved.as_ref(), + &options, + |event| { + if let TurnProgress::Prefill(super::prefill::Progress::Settled { + tokens, + total, + }) = event + { + eprintln!("#112 {chunk}/{rep}/{phase} {tokens}/{total}"); + } + Ok(()) + }, + |_| { + if ttft.get().is_none() { + ttft.set(Some(start.elapsed().as_secs_f64())); + } + Ok(()) + }, + |_| Ok(()), + ) + .unwrap(); + let elapsed = start.elapsed().as_secs_f64(); + assert!(out.final_snapshot_error.is_none()); + let snapshot = out.snapshot.unwrap(); + let state = super::issue104::state(&execution, &snapshot); + let hidden_state=snapshot.hidden.as_ref().map(|a| { + let values=execution.values_f32(a).unwrap(); + assert!(values.iter().all(|v|v.is_finite())); + serde_json::json!({"shape":a.layout().shape(),"sha256":super::super::qwen_mtplx_tests::hex_digest(&values.iter().flat_map(|v|v.to_le_bytes()).collect::>())}) + }); + assert!(hidden_state.is_none()); + let metrics = serde_json::json!({"chunk":chunk,"rep":rep,"phase":phase,"prompt":prompt.len(),"cached":out.cached_tokens,"ttft_seconds":ttft.get().unwrap(),"prefill_seconds":out.prefill_seconds,"prefill_tokens_per_second":(prompt.len()-out.cached_tokens) as f64/out.prefill_seconds,"elapsed_seconds":elapsed}); + let record = + serde_json::json!({"metrics":metrics,"state":state,"hidden":hidden_state}); + std::fs::write( + directory.join(format!("{chunk}-{rep}-{phase}.json")), + serde_json::to_vec(&record).unwrap(), + ) + .unwrap(); + println!( + "{}", + serde_json::json!({"case":"paired_prefill","metrics":metrics}) + ); + prompt = snapshot.token_ids.clone(); + prompt.extend(tokens(2048)); + saved = Some(snapshot); + } + } + } +} + +#[test] +#[ignore = "full installed model hidden-state prefill; serial supervisor required"] +fn issue112_hidden_prefill() { + let root = std::path::PathBuf::from(std::env::var_os("DS4_QWEN38_ARTIFACTS").unwrap()); + let directory = std::path::PathBuf::from(std::env::var_os("DS4_ISSUE112_DIR").unwrap()); + std::fs::create_dir_all(&directory).unwrap(); + let mut settings = crate::settings::effective_settings( + crate::model::ModelChoice::Qwen38FlashNext, + &crate::settings::GenerationPreferences { + context_tokens: 16384, + max_generated_tokens: 1, + ..Default::default() + }, + &crate::settings::RuntimePreferences::default(), + root.parent().unwrap(), + ) + .unwrap(); + settings.engine.speculative.glm_mtp = true; + let (mut execution, mut options) = Execution::open(&settings.engine).unwrap(); + options.decode = DecodeOptions::Ar(super::ar::Options { + max_tokens: 1, + seed: 1, + stop_tokens: &[], + sync_eval: false, + return_hidden: true, + capture_final_state: true, + }); + options.prefill.return_hidden = true; + options.store_min_suffix = None; + let tokens = |len: usize| { + (0..len) + .map(|i| [9707, 11, 1075, 374, 264, 1092, 13][i % 7]) + .collect::>() + }; + for chunk in [2048, 4096] { + options.prefill.chunk_size = Some(chunk); + let mut saved = None; + let mut prompt = tokens(4096); + for phase in ["cold", "warm"] { + let snapshot = execution + .prefill_session(&prompt, saved.as_ref(), &options, |event| { + if let super::prefill::Progress::Settled { tokens, total } = event { + eprintln!("#112 hidden {chunk}/{phase} {tokens}/{total}"); + } + Ok(()) + }) + .unwrap(); + let state = super::issue104::state(&execution, &snapshot); + let hidden = snapshot.hidden.as_ref().unwrap(); + let values = execution.values_f32(hidden).unwrap(); + assert!(values.iter().all(|v| v.is_finite())); + let hidden = serde_json::json!({"shape":hidden.layout().shape(),"sha256":super::super::qwen_mtplx_tests::hex_digest(&values.iter().flat_map(|v|v.to_le_bytes()).collect::>())}); + let record = serde_json::json!({"case":"hidden_prefill","chunk":chunk,"phase":phase,"cached":saved.as_ref().map_or(0,|s|s.token_ids.len()),"state":state,"hidden":hidden}); + std::fs::write( + directory.join(format!("{chunk}-{phase}.json")), + serde_json::to_vec(&record).unwrap(), + ) + .unwrap(); + println!( + "{}", + serde_json::json!({"case":"hidden_prefill","chunk":chunk,"phase":phase,"hidden":hidden}) + ); + prompt.extend(tokens(2048)); + saved = Some(snapshot); + } + } +} diff --git a/src/engine/metal/qwen_mtplx/linear.rs b/src/engine/metal/qwen_mtplx/linear.rs index 2eaf691..cbc752b 100644 --- a/src/engine/metal/qwen_mtplx/linear.rs +++ b/src/engine/metal/qwen_mtplx/linear.rs @@ -371,7 +371,7 @@ fn sorted_gather_guard_matches_pinned_call_predicates() { /// Guard both stock Gate/Up and Down gathers, including future fused-path /// fallbacks. Keep the underlying runtime primitive unchanged. -pub(super) fn guarded_gather_qmm_bf16( +pub(super) fn guarded_gather_qmm( x: &Array, weights: [&Array; 3], indices: [Option<&Array>; 2], @@ -390,7 +390,7 @@ pub(super) fn guarded_gather_qmm_bf16( super::sparse_attention::nax_available(), ); if pad == 0 { - return gather_qmm_bf16(x, weights, indices, quant, sorted, streams, stream); + return gather_qmm(x, weights, indices, quant, sorted, streams, stream); } let rows = shape[0]; #[cfg(test)] @@ -428,7 +428,7 @@ pub(super) fn guarded_gather_qmm_bf16( ops::concatenate(&[lhs.clone(), tail], 0, stream) }) .transpose()?; - let out = gather_qmm_bf16( + let out = gather_qmm( &x, weights, [lhs.as_ref(), Some(&rhs)], @@ -448,9 +448,9 @@ pub(super) fn guarded_gather_qmm_bf16( ) } -/// Installed affine/BF16, transposed GatherQMM from ops.cpp. Explicit index +/// Affine BF16/F16 transposed GatherQMM from ops.cpp. Explicit index /// casts use the default stream, as indices_or_default does in the reference. -pub(super) fn gather_qmm_bf16( +pub(super) fn gather_qmm( x: &Array, [w, scales, biases]: [&Array; 3], indices: [Option<&Array>; 2], @@ -466,17 +466,19 @@ pub(super) fn gather_qmm_bf16( let wl = w.layout(); let sl = scales.layout(); if stream.device() != Device::Gpu - || xl.dtype() != Dtype::BF16 + || !matches!(xl.dtype(), Dtype::BF16 | Dtype::F16) || wl.dtype() != Dtype::U32 - || sl.dtype() != Dtype::BF16 - || biases.layout().dtype() != Dtype::BF16 + || sl.dtype() != xl.dtype() + || biases.layout().dtype() != xl.dtype() || xl.shape().len() < 2 || wl.shape().len() < 2 || wl.shape().len() != sl.shape().len() || !matches!(bits, 4 | 8) - || !matches!(group, 32 | 64) + || !matches!(group, 32 | 64 | 128) { - return Err("GatherQMM requires BF16 GPU matrices and U32 affine expert weights".into()); + return Err( + "GatherQMM requires BF16/F16 GPU matrices and U32 affine expert weights".into(), + ); } let wrank = wl.shape().len(); let k = *xl.shape().last().unwrap() as u32; @@ -491,7 +493,9 @@ pub(super) fn gather_qmm_bf16( { return Err("GatherQMM input/weight/group shapes do not match".into()); } - affine_plan([m, n, k], bits, group, true)?; + if [m, n, k].iter().any(|&d| d == 0 || d > i32::MAX as u32) || !k.is_multiple_of(group) { + return Err("invalid GatherQMM shape".into()); + } let index = |a: &Array, indices: Option<&Array>| -> Result { if let Some(indices) = indices { if !matches!( @@ -530,7 +534,7 @@ pub(super) fn gather_qmm_bf16( )?); let mut shape = inputs[4].layout().shape().to_vec(); shape.extend([m as i32, n as i32]); - let layout = Layout::new(&shape, Dtype::BF16)?; + let layout = Layout::new(&shape, xl.dtype())?; if layout.size() > i32::MAX as usize { return Err("GatherQMM output size overflow".into()); } @@ -538,7 +542,7 @@ pub(super) fn gather_qmm_bf16( stream, &inputs, layout, - Operation::GatherQmmBf16 { + Operation::GatherQmm { bits, group, right_sorted: sorted && indices[0].is_none(), @@ -575,7 +579,7 @@ pub(super) fn gather_evaluate( if prepared[0].layout().size() / k as usize != prepared[5].layout().size() { let mut shape = prepared[5].layout().shape().to_vec(); shape.extend([m as i32, k as i32]); - let broadcast = Array::unallocated(&shape, Dtype::BF16)?; + let broadcast = Array::unallocated(&shape, prepared[0].layout().dtype())?; views::broadcast(&prepared[0], &broadcast)?; prepared[0] = broadcast; } @@ -596,7 +600,7 @@ pub(super) fn gather_evaluate( views::collapse_joint(ll.shape(), &[ll.strides(), rl.strides()]); let arrays = [w, s, b, x, lhs, rhs, output]; let buffers = arrays.map(Array::buffer); - super::gather_bf16_layout( + super::gather_layout( std::array::from_fn(|i| { let binding = super::tensor(i as u32, &buffers[i]).at_byte_offset(arrays[i].offset()); if i == 6 { @@ -605,6 +609,7 @@ pub(super) fn gather_evaluate( binding.input(arrays[i].data_size()) } }), + xl.dtype(), [m, n, k, experts, batches, sorted_rows], [bits, group], right_sorted, @@ -1058,7 +1063,7 @@ fn mtplx_graph_gather_qmm_matches_reference() { .unwrap(); } let (output, construction) = capture_dispatches(|| { - gather_qmm_bf16( + gather_qmm( &x, [&w, &s, &b], [left.then_some(&lhs), right.then_some(&rhs)], diff --git a/src/engine/metal/qwen_mtplx/model.rs b/src/engine/metal/qwen_mtplx/model.rs index 6bc3977..8862dd2 100644 --- a/src/engine/metal/qwen_mtplx/model.rs +++ b/src/engine/metal/qwen_mtplx/model.rs @@ -721,7 +721,7 @@ impl TextModel<'_> { O::RmsNorm(_) => "RMSNorm", O::Softmax(_) => "Softmax", O::QuantizedLinearBf16 { .. } => "QuantizedMatmul", - O::GatherQmmBf16 { .. } => "GatherQMM", + O::GatherQmm { .. } => "GatherQMM", O::DenseMatmul => "Matmul", O::Sum(_) => "Sum", O::Sort { diff --git a/src/engine/metal/qwen_mtplx/moe.rs b/src/engine/metal/qwen_mtplx/moe.rs index 62d43ed..a7e4238 100644 --- a/src/engine/metal/qwen_mtplx/moe.rs +++ b/src/engine/metal/qwen_mtplx/moe.rs @@ -27,7 +27,7 @@ fn gather( streams: &Streams, stream: Stream, ) -> Result { - linear::guarded_gather_qmm_bf16( + linear::guarded_gather_qmm( input, [&layer.weight, &layer.scales, &layer.biases], [None, Some(ids)], @@ -55,13 +55,19 @@ impl FeedForward { &self, input: &Array, indices: &Array, + sorted_gather: bool, streams: &Streams, stream: Stream, ) -> Result { - let mut x = ops::expand_dims(input, &[-2, -3], stream)?; let do_sort = indices.layout().size() >= 64; + let mut x = if do_sort { + input.clone() + } else { + ops::expand_dims(input, &[-2, -3], stream)? + }; let mut ids = indices.clone(); let mut inverse = None; + let mut row_map = None; if do_sort { let size = i32::try_from(indices.layout().size()).map_err(|_| "MoE index size overflow")?; @@ -76,33 +82,46 @@ impl FeedForward { let k = *input.layout().shape().last().ok_or("MoE input rank")?; let flat_rows = i32::try_from(input.layout().size() / k as usize) .map_err(|_| "MoE row count overflow")?; - x = indexing::take( - &ops::reshape(&x, &[flat_rows, 1, k], stream)?, - &rows, - 0, - stream, - )?; + x = ops::reshape(&x, &[flat_rows, 1, k], stream)?; + row_map = Some(rows); ids = indexing::take(&ids, &order, 0, stream)?; } - let hidden = match &self.input { - GateUp::Fused(gu) => { - let gu = gather(&x, gu, &ids, do_sort, streams, stream)?; - let n = *gu.layout().shape().last().ok_or("MoE gate/up rank")?; - if n % 2 != 0 { - return Err("MoE fused gate/up width must be even".into()); + let hidden = if let Some(map) = row_map { + let (gate, up) = match &self.input { + GateUp::Fused(gu) => (gu, None), + GateUp::Separate { gate, up } => (gate, Some(up)), + }; + super::moe_sorted::swiglu_rows( + &x, + &map, + gate, + up, + &ids, + sorted_gather, + streams, + stream, + )? + } else { + match &self.input { + GateUp::Fused(gu) => { + let gu = gather(&x, gu, &ids, do_sort, streams, stream)?; + let n = *gu.layout().shape().last().ok_or("MoE gate/up rank")?; + if n % 2 != 0 { + return Err("MoE fused gate/up width must be even".into()); + } + let pair = ops::split(&gu, &[n / 2], -1, stream)?; + binary( + &mlp::silu(&pair[0], stream)?, + &pair[1], + Binary::Multiply, + stream, + )? + } + GateUp::Separate { gate, up } => { + let up = gather(&x, up, &ids, do_sort, streams, stream)?; + let gate = gather(&x, gate, &ids, do_sort, streams, stream)?; + mlp::swiglu(&gate, &up, stream)? } - let pair = ops::split(&gu, &[n / 2], -1, stream)?; - binary( - &mlp::silu(&pair[0], stream)?, - &pair[1], - Binary::Multiply, - stream, - )? - } - GateUp::Separate { gate, up } => { - let up = gather(&x, up, &ids, do_sort, streams, stream)?; - let gate = gather(&x, gate, &ids, do_sort, streams, stream)?; - mlp::swiglu(&gate, &up, stream)? } }; let mut output = gather(&hidden, &self.down, &ids, do_sort, streams, stream)?; @@ -123,6 +142,7 @@ pub(super) struct SparseMoe { pub(super) shared_gate: QuantizedLinear, pub(super) topk: i32, pub(super) normalize: bool, + pub(super) sorted_gather: bool, pub(super) fused_decode: bool, pub(super) fused_verify: bool, } @@ -199,7 +219,9 @@ impl SparseMoe { stream, )? } else { - let switched = self.experts.switched(input, &indices, streams, stream)?; + let switched = + self.experts + .switched(input, &indices, self.sorted_gather, streams, stream)?; let scores = ops::expand_dims(&scores, &[-1], stream)?; reduce::sum( &binary(&switched, &scores, Binary::Multiply, stream)?, @@ -413,6 +435,7 @@ fn mtplx_graph_sparse_moe_matches_reference() { shared_gate: mlp::fixture_linear(1, k, 4, 64, 52), topk: 10, normalize: row["normalize"].as_bool().unwrap(), + sorted_gather: true, fused_decode: row["fused"].as_bool().unwrap_or(false), fused_verify: row["fused"].as_bool().unwrap_or(false), }; diff --git a/src/engine/metal/qwen_mtplx/moe_sorted.rs b/src/engine/metal/qwen_mtplx/moe_sorted.rs new file mode 100644 index 0000000..06bcb1c --- /dev/null +++ b/src/engine/metal/qwen_mtplx/moe_sorted.rs @@ -0,0 +1,839 @@ +//! MTPLX 9882703 expert row-map gather, including whole-first-call canaries. +use super::array::{Array, Dtype, Layout}; +use super::binary::{Binary, binary, floor_divide_integer}; +use super::mlp::{self, QuantizedLinear}; +use super::stream::{Stream, Streams}; +use super::{indexing, linear, ops}; +use std::collections::BTreeMap; +use std::sync::{LazyLock, Mutex}; + +#[derive(Default, Clone, Copy, Debug)] +pub(super) struct Stats { + pub(super) calls: u64, + pub(super) fallbacks: u64, + pub(super) canaries: u64, + pub(super) failures: u64, +} +static CANARY: LazyLock, Stats)>> = + LazyLock::new(|| Mutex::new((BTreeMap::new(), Stats::default()))); + +#[cfg(test)] +pub(super) fn stats() -> Stats { + CANARY.lock().unwrap().1 +} + +#[cfg(test)] +static FAILURE: std::sync::atomic::AtomicU8 = std::sync::atomic::AtomicU8::new(0); + +#[derive(Clone, Copy, Debug)] +pub(super) struct Kernel { + dtype: Dtype, + bits: u32, + group: u32, + k: i32, + n: i32, + experts: i32, + swiglu: bool, + separate: bool, +} + +impl Kernel { + fn width(self) -> i32 { + if self.swiglu && !self.separate { + self.n / 2 + } else { + self.n + } + } + fn name(self) -> String { + format!( + "kernel_qwen_mtplx_sorted_{}_g{}_b{}_k{}_n{}_e{}_s{}_u{}", + self.dtype.kernel_name(), + self.group, + self.bits, + self.k, + self.n, + self.experts, + u8::from(self.swiglu), + u8::from(self.separate) + ) + } + fn source(self) -> String { + let ty = if self.dtype == Dtype::BF16 { + "bfloat16_t" + } else { + "float16_t" + }; + let params = [ + ("x", ty), + ("w", "uint"), + ("scales", ty), + ("biases", ty), + ("wu", "uint"), + ("scales_u", ty), + ("biases_u", ty), + ("tile_start", "int"), + ("row_start", "int"), + ("row_map", "uint"), + ] + .iter() + .enumerate() + .map(|(i, (name, ty))| format!("const device {ty}* {name} [[buffer({i})]]")) + .collect::>() + .join(",\n"); + format!( + "{}\nusing T={ty};\nconstant int GS={}, BITS={}, KD={}, ND={}, UD={}, UOFF={}, OUTC={}, ED={};\nconstant bool SWIGLU={};\nkernel void {}({params}, device T* y [[buffer(10)]], uint3 threadgroup_position_in_grid [[threadgroup_position_in_grid]], uint simdgroup_index_in_threadgroup [[simdgroup_index_in_threadgroup]], uint thread_index_in_simdgroup [[thread_index_in_simdgroup]]) {{\n{}\n}}", + include_str!("../../../../metal/mtplx-moe-sorted-header.metal"), + self.group, + self.bits, + self.k, + self.n, + self.n, + if self.swiglu && !self.separate { + self.n / 2 + } else { + 0 + }, + self.width(), + self.experts, + self.swiglu, + self.name(), + include_str!("../../../../metal/mtplx-moe-sorted-body.metal") + ) + } + pub(super) fn evaluate(self, inputs: &[Array], outputs: &[Array]) -> Result<(), String> { + super::compile_custom(&self.name(), || { + #[cfg(test)] + if FAILURE.load(std::sync::atomic::Ordering::Relaxed) == 1 { + return Ok("injected invalid Metal source".into()); + } + Ok(self.source()) + })?; + let rows = outputs[0].layout().shape()[0] as u32; + let cols = if self.swiglu { + self.width() * 2 + } else { + self.n + } as u32; + super::gdn::custom_evaluate(inputs, outputs, |bindings| { + super::dispatch_geometry( + &self.name(), + bindings, + &[], + [ + (cols / 64) * 128, + rows.div_ceil(64) + self.experts as u32, + 1, + ], + [128, 1, 1], + true, + ) + }) + } +} + +// Applies mirrors the affine tensor/layout predicates. QuantizedLinear always +// carries biases and affine mode; separate packs must also share quantization. +pub(super) fn applies( + tokens: &Array, + map: &Array, + gate: &QuantizedLinear, + up: Option<&QuantizedLinear>, + ids: &Array, + enabled: bool, + nax: bool, +) -> bool { + if let Some(up) = up + && (gate.bits != up.bits + || gate.group != up.group + || [&gate.weight, &gate.scales, &gate.biases] + .iter() + .zip([&up.weight, &up.scales, &up.biases]) + .any(|(a, b)| { + a.layout().shape() != b.layout().shape() + || a.layout().dtype() != b.layout().dtype() + })) + { + return false; + } + let x = tokens.layout(); + let w = gate.weight.layout(); + let s = gate.scales.layout(); + let b = gate.biases.layout(); + let r = map.layout(); + let i = ids.layout(); + enabled + && nax + && matches!(gate.bits, 4 | 8) + && matches!(gate.group, 32 | 64 | 128) + && matches!(x.dtype(), Dtype::BF16 | Dtype::F16) + && x.shape().len() == 3 + && x.shape()[1] == 1 + && s.dtype() == x.dtype() + && b.dtype() == x.dtype() + && i.shape().len() == 1 + && r.shape() == i.shape() + && i.size() >= 4096 + && r.dtype() == Dtype::U32 + && w.shape().len() == 3 + && w.dtype() == Dtype::U32 + && w.shape()[1] % 64 == 0 + && (w.shape()[2] * 32 / gate.bits as i32) % 64 == 0 + && x.shape()[2] == w.shape()[2] * 32 / gate.bits as i32 + && x.shape()[2] % gate.group as i32 == 0 +} + +fn scalar(n: i32) -> Result { + Array::new(&[], Dtype::I32, super::scalar_buffer(&n.to_le_bytes())?) +} +fn schedule(ids: &Array, experts: i32, stream: Stream) -> Result<(Array, Array), String> { + if !matches!( + ids.layout().dtype(), + Dtype::U8 + | Dtype::U16 + | Dtype::U32 + | Dtype::U64 + | Dtype::I8 + | Dtype::I16 + | Dtype::I32 + | Dtype::I64 + ) { + return Err("MoE expert indices must be integral".into()); + } + let ids = ops::contiguous(&ops::astype(ids, Dtype::U32, false, stream)?, false, stream)?; + let zero = ops::zeros(&[experts], Dtype::I32, stream)?; + let counts = Array::make_operation_with_inputs( + stream, + &[zero, ids.clone()], + Layout::new(&[experts], Dtype::I32)?, + ops::Operation::MoeSortedCounts, + )?; + let row_start = ops::concatenate( + &[ + ops::zeros(&[1], Dtype::I32, stream)?, + indexing::cumsum_last_i32(&counts, stream)?, + ], + 0, + stream, + )?; + let tiles = floor_divide_integer( + &binary(&counts, &scalar(63)?, Binary::Add, stream)?, + &scalar(64)?, + stream, + )?; + let tile_start = ops::concatenate( + &[ + ops::zeros(&[1], Dtype::I32, stream)?, + indexing::cumsum_last_i32(&tiles, stream)?, + ], + 0, + stream, + )?; + Ok((tile_start, row_start)) +} + +pub(super) fn counts_evaluate(inputs: &[Array], output: &Array) -> Result<(), String> { + // Same zeros.at[ids].add(1) schedule, with integer atomic sums on the GPU. + // The pinned library does not export this integer scatter specialization. + const NAME: &str = "kernel_qwen_mtplx_sorted_counts"; + super::compile_custom(NAME, || { + Ok("#include \nusing namespace metal;\nkernel void kernel_qwen_mtplx_sorted_counts(const device uint* ids [[buffer(0)]], device atomic_int* counts [[buffer(1)]], constant uint& size [[buffer(2)]],uint i [[thread_position_in_grid]]) { if(i, + ids: &Array, + kernel: Kernel, + stream: Stream, +) -> Result { + let (tiles, rows) = schedule(ids, kernel.experts, stream)?; + let u = up.unwrap_or(gate); + let input = ops::reshape(tokens, &[-1, kernel.k], stream)?; + let y = Array::make_operation_with_inputs( + stream, + &[ + input, + gate.weight.clone(), + gate.scales.clone(), + gate.biases.clone(), + u.weight.clone(), + u.scales.clone(), + u.biases.clone(), + tiles, + rows, + map.clone(), + ], + Layout::new(&[ids.layout().shape()[0], kernel.width()], kernel.dtype)?, + ops::Operation::MoeSortedGather(kernel), + )?; + ops::reshape(&y, &[ids.layout().shape()[0], 1, kernel.width()], stream) +} + +fn gather( + x: &Array, + q: &QuantizedLinear, + ids: &Array, + streams: &Streams, + stream: Stream, +) -> Result { + linear::guarded_gather_qmm( + x, + [&q.weight, &q.scales, &q.biases], + [None, Some(ids)], + [q.bits, q.group], + true, + streams, + stream, + ) +} + +fn activation(gate: &Array, up: &Array, separate: bool, stream: Stream) -> Result { + if gate.layout().dtype() == Dtype::BF16 { + return if separate { + mlp::swiglu(gate, up, stream) + } else { + binary(&mlp::silu(gate, stream)?, up, Binary::Multiply, stream) + }; + } + let graph = super::compiled::Replay::trace_compiled(&[gate.clone(), up.clone()], |a| { + let sig = super::unary::unary(&a[0], super::unary::Unary::Sigmoid, stream)?; + let silu = binary(&a[0], &sig, Binary::Multiply, stream)?; + Ok(vec![if separate { + binary(&silu, &a[1], Binary::Multiply, stream)? + } else { + silu + }]) + })?; + let result = graph.run(&[gate.clone(), up.clone()])?.remove(0); + if separate { + Ok(result) + } else { + binary(&result, up, Binary::Multiply, stream) + } +} + +#[allow(clippy::too_many_arguments)] +fn stock( + tokens: &Array, + map: &Array, + gate: &QuantizedLinear, + up: Option<&QuantizedLinear>, + ids: &Array, + swiglu: bool, + streams: &Streams, + stream: Stream, +) -> Result { + let x = indexing::take(tokens, map, 0, stream)?; + let y = gather(&x, gate, ids, streams, stream)?; + if !swiglu { + return Ok(y); + } + if let Some(up) = up { + activation(&y, &gather(&x, up, ids, streams, stream)?, true, stream) + } else { + let pair = ops::split(&y, &[y.layout().dim(-1)? / 2], -1, stream)?; + activation(&pair[0], &pair[1], false, stream) + } +} + +#[allow(clippy::too_many_arguments)] +fn checked( + tokens: &Array, + map: &Array, + gate: &QuantizedLinear, + up: Option<&QuantizedLinear>, + ids: &Array, + swiglu: bool, + streams: &Streams, + stream: Stream, +) -> Result, String> { + let kernel = Kernel { + dtype: tokens.layout().dtype(), + bits: gate.bits, + group: gate.group, + k: tokens.layout().dim(-1)?, + n: gate.weight.layout().dim(-2)?, + experts: gate.weight.layout().shape()[0], + swiglu, + separate: up.is_some(), + }; + let key = format!( + "{}_{}", + kernel.name(), + if ids.layout().size() >= 64 * kernel.experts as usize { + "wide" + } else { + "narrow" + } + ); + let mut state = CANARY.lock().map_err(|_| "MoE canary lock poisoned")?; + if state.0.get(&key) == Some(&false) { + state.1.fallbacks += 1; + return Ok(None); + } + if state.0.get(&key) == Some(&true) { + state.1.calls += 1; + drop(state); + return launch(tokens, map, gate, up, ids, kernel, stream).map(Some); + } + state.1.canaries += 1; + let probe: Result = (|| { + let ours = launch(tokens, map, gate, up, ids, kernel, stream)?; + let reference = stock(tokens, map, gate, up, ids, swiglu, streams, stream)?; + ops::evaluate(streams, &[ours.clone(), reference.clone()], stream, false)?; + #[cfg(test)] + if FAILURE.load(std::sync::atomic::Ordering::Relaxed) == 2 { + let mut bits = [0u8; 2]; + ours.buffer().read(ours.offset(), &mut bits)?; + bits[1] ^= 0x80; + ours.buffer().write(ours.offset(), &bits)?; + } + #[cfg(test)] + if FAILURE.load(std::sync::atomic::Ordering::Relaxed) == 3 { + ours.buffer().write(ours.offset(), &[0, 128])?; + reference.buffer().write(reference.offset(), &[0, 0])?; + } + let equal = binary( + &ops::view(&ours, Dtype::U16, stream)?, + &ops::view(&reference, Dtype::U16, stream)?, + Binary::Equal, + stream, + )?; + let different = super::unary::unary(&equal, super::unary::Unary::LogicalNot, stream)?; + let mismatch = super::reduce::any(&different, &[0, 1, 2], false, stream)?; + ops::evaluate(streams, std::slice::from_ref(&mismatch), stream, false)?; + let mut failed = [0u8]; + mismatch.buffer().read(mismatch.offset(), &mut failed)?; + if failed[0] != 0 { + return Err( + "first whole-call output differs bit for bit from the stock sorted gather".into(), + ); + } + Ok(ours) + })(); + match probe { + Ok(ours) => { + state.0.insert(key.clone(), true); + state.1.calls += 1; + eprintln!( + "[moe-sorted-gather] tensor-unit kernel on for {key}: first call equals stock bit for bit" + ); + Ok(Some(ours)) + } + Err(reason) => { + state.0.insert(key.clone(), false); + state.1.failures += 1; + state.1.fallbacks += 1; + eprintln!( + "[moe-sorted-gather] tensor-unit kernel off for {key}: {reason}; stock sorted gather runs instead (canary_failures={})", + state.1.failures + ); + Ok(None) + } + } +} + +#[allow(clippy::too_many_arguments)] +pub(super) fn swiglu_rows( + tokens: &Array, + map: &Array, + gate: &QuantizedLinear, + up: Option<&QuantizedLinear>, + ids: &Array, + enabled: bool, + streams: &Streams, + stream: Stream, +) -> Result { + let eligible = applies( + tokens, + map, + gate, + up, + ids, + enabled, + super::sparse_attention::nax_available(), + ); + if eligible && let Some(y) = checked(tokens, map, gate, up, ids, true, streams, stream)? { + return Ok(y); + } + // The fused-weight wrapper retries its plain row-map gather if the SwiGLU + // canary failed. Separate SwitchGLU instead returns to its original chain. + if eligible + && up.is_none() + && let Some(gu) = checked(tokens, map, gate, None, ids, false, streams, stream)? + { + let pair = ops::split(&gu, &[gu.layout().dim(-1)? / 2], -1, stream)?; + return activation(&pair[0], &pair[1], false, stream); + } + if let Some(up) = up { + let x = indexing::take(tokens, map, 0, stream)?; + let up = gather(&x, up, ids, streams, stream)?; + let gate = gather(&x, gate, ids, streams, stream)?; + return activation(&gate, &up, true, stream); + } + stock(tokens, map, gate, None, ids, true, streams, stream) +} + +#[test] +#[ignore = "Metal synthetic all supported row-map variants; external supervisor"] +fn issue112_all_kernel_variants() { + use super::super::{ + gpu::Context, + qwen_mtplx_tests::{hex_digest, pattern}, + }; + super::configure_sources().unwrap(); + let _context = Context::open_qwen(0).unwrap(); + let streams = Streams::new(Some(super::allocator::Allocator::new().unwrap())); + let gpu = streams.default_stream(super::stream::Device::Gpu).unwrap(); + let e = 128; + let n = 256; + let k = 256; + let tokens = 512; + let read = |a: &Array| { + ops::evaluate(&streams, std::slice::from_ref(a), gpu, false).unwrap(); + let mut v = vec![0; a.layout().nbytes()]; + a.buffer().read(a.offset(), &mut v).unwrap(); + v + }; + let u32s = |v: Vec| { + Array::new( + &[v.len() as i32], + Dtype::U32, + super::scalar_buffer(&v.into_iter().flat_map(u32::to_le_bytes).collect::>()) + .unwrap(), + ) + .unwrap() + }; + for dtype in [Dtype::BF16, Dtype::F16] { + for bits in [4, 8] { + for group in [32, 64, 128] { + let pack = |salt| { + let mut q = mlp::fixture_linear(e * n, k, bits, group, salt); + for a in [&mut q.weight, &mut q.scales, &mut q.biases] { + let width = a.layout().dim(-1).unwrap(); + *a = ops::reshape(a, &[e as i32, n as i32, width], gpu).unwrap(); + if a.layout().dtype() == Dtype::BF16 { + *a = ops::astype(a, dtype, false, gpu).unwrap(); + } + } + q + }; + let gate = pack(7); + let up = pack(9); + let x = ops::astype( + &Array::new( + &[tokens, 1, k as i32], + Dtype::BF16, + pattern(tokens as u32 * k, 8), + ) + .unwrap(), + dtype, + false, + gpu, + ) + .unwrap(); + for separate in [false, true] { + for rows in [4096, 8193, 32769] { + eprintln!( + "row-map {dtype:?} b{bits}/g{group} separate={separate} rows={rows}" + ); + let ids = u32s( + (0..rows) + .map(|r| (r * (e - 3) / rows) / 2 * 2 + 1) + .collect(), + ); + let map = u32s((0..rows).map(|r| (r * 13) % tokens as u32).collect()); + let ids = if rows == 32769 { + ops::astype(&ids, Dtype::I64, false, gpu).unwrap() + } else { + ids + }; + let map = if rows == 8193 { + let repeated = ops::repeat(&map, 2, 0, gpu).unwrap(); + ops::slice(&repeated, &[0], &[(rows * 2) as i32], &[2], gpu).unwrap() + } else { + map + }; + let up = separate.then_some(&up); + assert!(applies(&x, &map, &gate, up, &ids, true, true)); + assert!(!applies(&x, &map, &gate, up, &ids, false, true)); + assert!(!applies(&x, &map, &gate, up, &ids, true, false)); + let before = stats(); + let y = + swiglu_rows(&x, &map, &gate, up, &ids, true, &streams, gpu).unwrap(); + let got = read(&y); + let reference = + read(&stock(&x, &map, &gate, up, &ids, true, &streams, gpu).unwrap()); + assert_eq!(got, reference); + let after = stats(); + assert_eq!(after.failures, before.failures, "{after:?}"); + assert_eq!(after.calls, before.calls + 1); + println!( + "{}", + serde_json::json!({"case":"synthetic","dtype":format!("{dtype:?}"),"bits":bits,"group":group,"separate":separate,"rows":rows,"sha256":hex_digest(&got),"canaries":after.canaries,"calls":after.calls}) + ); + } + } + } + } + } +} + +#[test] +#[ignore = "Metal canary rejection and sticky fallback; external supervisor"] +fn issue112_canary_failures() { + use super::super::{gpu::Context, qwen_mtplx_tests::pattern}; + super::configure_sources().unwrap(); + let _context = Context::open_qwen(0).unwrap(); + let streams = Streams::new(Some(super::allocator::Allocator::new().unwrap())); + let gpu = streams.default_stream(super::stream::Device::Gpu).unwrap(); + let rows = 4096; + let e = 16; + let n = 128; + let k = 256; + let u32s = |v: Vec| { + Array::new( + &[v.len() as i32], + Dtype::U32, + super::scalar_buffer(&v.into_iter().flat_map(u32::to_le_bytes).collect::>()) + .unwrap(), + ) + .unwrap() + }; + let x = Array::new(&[1, 1, k], Dtype::BF16, pattern(k as u32, 8)).unwrap(); + let ids = u32s((0..rows).map(|r| r * e / rows).collect()); + let map = u32s(vec![0; rows as usize]); + let read = |a: &Array| { + ops::evaluate(&streams, std::slice::from_ref(a), gpu, false).unwrap(); + let mut v = vec![0; a.layout().nbytes()]; + a.buffer().read(a.offset(), &mut v).unwrap(); + v + }; + for (failure, group) in [(1, 32), (2, 64), (3, 128)] { + for separate in [false, true] { + let mut q = mlp::fixture_linear(e * n, k as u32, 4, group, 7); + for a in [&mut q.weight, &mut q.scales, &mut q.biases] { + let width = a.layout().dim(-1).unwrap(); + *a = ops::reshape(a, &[e as i32, n as i32, width], gpu).unwrap(); + } + let up = separate.then_some(&q); + let reference = read(&stock(&x, &map, &q, up, &ids, true, &streams, gpu).unwrap()); + let before = stats(); + FAILURE.store(failure, std::sync::atomic::Ordering::Relaxed); + let actual = read(&swiglu_rows(&x, &map, &q, up, &ids, true, &streams, gpu).unwrap()); + FAILURE.store(0, std::sync::atomic::Ordering::Relaxed); + assert_eq!(actual, reference); + let rejected = stats(); + assert_eq!( + rejected.failures - before.failures, + if separate { 1 } else { 2 } + ); + assert_eq!( + read(&swiglu_rows(&x, &map, &q, up, &ids, true, &streams, gpu).unwrap()), + reference + ); + let after = stats(); + assert_eq!(after.canaries, rejected.canaries); + assert_eq!(after.calls, before.calls); + assert_eq!(after.failures, rejected.failures); + println!( + "{}", + serde_json::json!({"case":"sticky_fallback","failure":failure,"separate":separate,"canaries":after.canaries,"failures":after.failures,"fallbacks":after.fallbacks,"exact":true}) + ); + } + } +} + +#[test] +fn row_map_applicability() { + let a = |shape: &[i32], dtype| Array::unallocated(shape, dtype).unwrap(); + let q = QuantizedLinear { + weight: a(&[128, 256, 32], Dtype::U32), + scales: a(&[128, 256, 4], Dtype::BF16), + biases: a(&[128, 256, 4], Dtype::BF16), + bits: 4, + group: 64, + }; + let x = a(&[512, 1, 256], Dtype::BF16); + for rows in [1, 40, 63, 64, 4095, 4096, 32769] { + let map = a(&[rows], Dtype::U32); + let ids = a(&[rows], Dtype::U32); + assert_eq!(applies(&x, &map, &q, None, &ids, true, true), rows >= 4096); + assert!(!applies(&x, &map, &q, None, &ids, false, true)); + assert!(!applies(&x, &map, &q, None, &ids, true, false)); + } + let ids = a(&[4096], Dtype::U32); + for map in [ + a(&[4096], Dtype::I32), + a(&[1, 4096], Dtype::U32), + a(&[4095], Dtype::U32), + ] { + assert!(!applies(&x, &map, &q, None, &ids, true, true)); + } + for x in [ + a(&[512, 1, 256], Dtype::F32), + a(&[512, 256], Dtype::BF16), + a(&[512, 2, 256], Dtype::BF16), + a(&[512, 1, 128], Dtype::BF16), + ] { + assert!(!applies(&x, &ids, &q, None, &ids, true, true)); + } + let mut bad = q.clone(); + bad.group = 16; + assert!(!applies(&x, &ids, &bad, None, &ids, true, true)); + bad = q.clone(); + bad.bits = 2; + assert!(!applies(&x, &ids, &bad, None, &ids, true, true)); + bad = q.clone(); + bad.scales = a(&[128, 256, 4], Dtype::F16); + assert!(!applies(&x, &ids, &bad, None, &ids, true, true)); + bad = q.clone(); + bad.weight = a(&[128, 255, 32], Dtype::U32); + assert!(!applies(&x, &ids, &bad, None, &ids, true, true)); + assert!(!applies(&x, &ids, &q, Some(&bad), &ids, true, true)); +} + +#[test] +#[ignore = "installed projection weights; external supervisor required"] +fn issue112_installed_gate_up() { + use super::super::{ + gpu::Context, + qwen_mtplx_tests::{hex_digest, pattern}, + }; + super::configure_sources().unwrap(); + let _context = Context::open_qwen(0).unwrap(); + let streams = Streams::new(Some(super::allocator::Allocator::new().unwrap())); + let gpu = streams.default_stream(super::stream::Device::Gpu).unwrap(); + let root = std::path::PathBuf::from(std::env::var_os("DS4_QWEN38_ARTIFACTS").unwrap()); + let weights = super::weights::load_shards(&root, &streams).unwrap(); + let parts = |name: &str| { + ["weight", "scales", "biases"].map(|p| { + weights[&format!("language_model.model.layers.0.mlp.switch_mlp.{name}.{p}")].clone() + }) + }; + let gate = parts("gate_proj"); + let up = parts("up_proj"); + let gu = std::array::from_fn(|i| { + ops::concatenate(&[gate[i].clone(), up[i].clone()], 1, gpu).unwrap() + }); + let pack = |[weight, scales, biases]: [Array; 3]| QuantizedLinear { + weight, + scales, + biases, + bits: 4, + group: 64, + }; + let fused = pack(gu); + let gate = pack(gate); + let up = pack(up); + let u32s = |v: Vec| { + Array::new( + &[v.len() as i32], + Dtype::U32, + super::scalar_buffer(&v.into_iter().flat_map(u32::to_le_bytes).collect::>()) + .unwrap(), + ) + .unwrap() + }; + let read = |a: &Array| { + ops::evaluate(&streams, std::slice::from_ref(a), gpu, false).unwrap(); + let mut v = vec![0; a.layout().nbytes()]; + a.buffer().read(a.offset(), &mut v).unwrap(); + v + }; + for tokens in [410, 2048, 3277, 4095, 4096, 8192] { + let rows = tokens * 10; + let x = Array::new( + &[tokens as i32, 1, 2560], + Dtype::BF16, + pattern(tokens * 2560, 7), + ) + .unwrap(); + let ids = u32s((0..rows).map(|r| r * 512 / rows).collect()); + let map = u32s((0..rows).map(|r| r % tokens).collect()); + let mut packed = None; + for separate in [false, true] { + let (g, u) = if separate { + (&gate, Some(&up)) + } else { + (&fused, None) + }; + let before = stats(); + let y = swiglu_rows(&x, &map, g, u, &ids, true, &streams, gpu).unwrap(); + let got = read(&y); + assert_eq!( + got, + read(&stock(&x, &map, g, u, &ids, true, &streams, gpu).unwrap()) + ); + let hash = hex_digest(&got); + if let Some(packed) = &packed { + assert_eq!(&hash, packed); + } else { + packed = Some(hash.clone()); + } + let after = stats(); + assert_eq!(after.failures, before.failures); + assert_eq!(after.calls, before.calls + 1); + println!( + "{}", + serde_json::json!({"case":"installed_gate_up","tokens":tokens,"rows":rows,"separate":separate,"sha256":hash,"canaries":after.canaries,"calls":after.calls,"exact":true}) + ); + } + } +} + +#[test] +#[ignore = "full installed model; validates all cold/warm state receipts against the pre-port oracle"] +fn issue112_full_model_state() { + let before = stats(); + super::issue110::issue110_large_cold_and_warm_prefill(); + let after = stats(); + assert!(after.calls > before.calls); + assert_eq!(after.failures, before.failures); + let directory = std::path::PathBuf::from(std::env::var_os("DS4_ISSUE110_DIR").unwrap()); + for chunk in [2048, 4096] { + for phase in ["cold", "warm"] { + let actual: serde_json::Value = serde_json::from_slice( + &std::fs::read(directory.join(format!("{chunk}-{phase}.json"))).unwrap(), + ) + .unwrap(); + let expected: serde_json::Value = serde_json::from_slice( + &std::fs::read( + std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join(format!( + "docs/issue110-sorted-gather/{chunk}-{phase}-state.json" + )), + ) + .unwrap(), + ) + .unwrap(); + assert_eq!(actual["state"], expected["state"]); + assert_eq!(actual["cached"], expected["cached"]); + } + } + println!( + "{}", + serde_json::json!({"case":"model_state","calls":after.calls,"canaries":after.canaries,"failures":after.failures,"cold_warm_exact":true}) + ); +} diff --git a/src/engine/metal/qwen_mtplx/ops.rs b/src/engine/metal/qwen_mtplx/ops.rs index 6f0be91..371d0a7 100644 --- a/src/engine/metal/qwen_mtplx/ops.rs +++ b/src/engine/metal/qwen_mtplx/ops.rs @@ -6,6 +6,8 @@ use super::stream::{Device, Stream, Streams}; use super::{eval, views}; pub(super) enum Operation { + MoeSortedGather(super::moe_sorted::Kernel), + MoeSortedCounts, Vision(super::vision_kernels::Kernel), Compiled(super::fused::Expression), Load(super::load::Load), @@ -60,7 +62,7 @@ pub(super) enum Operation { bits: u32, group: u32, }, - GatherQmmBf16 { + GatherQmm { bits: u32, group: u32, right_sorted: bool, @@ -134,6 +136,9 @@ pub(super) enum Operation { impl Operation { fn evaluate(&self, input: &Array, output: &Array, stream: Stream) -> Result<(), String> { match self { + Self::MoeSortedGather(_) | Self::MoeSortedCounts => { + Err("sorted MoE requires captured inputs".into()) + } Self::Compiled(_) => Err("compiled expression requires all inputs/outputs".into()), Self::QsaCompiledScalar(_) => { Err("compiled scalar requires its captured inputs".into()) @@ -215,7 +220,7 @@ impl Operation { | Self::ArangeI64 => Err("invalid indexing arity".into()), Self::Vision(_) | Self::RmsNorm(_) => Err("RMSNorm requires two inputs".into()), Self::QuantizedLinearBf16 { .. } => Err("quantized linear requires four inputs".into()), - Self::GatherQmmBf16 { .. } => Err("GatherQMM requires six inputs".into()), + Self::GatherQmm { .. } => Err("GatherQMM requires six inputs".into()), Self::AffineQuantize { .. } => Err("quantize requires three sibling outputs".into()), Self::AffineDequantize { .. } => Err("dequantize requires three inputs".into()), Self::HyperRead(_) | Self::HyperV3R1 | Self::HyperV3R2 => { @@ -262,6 +267,12 @@ pub(super) fn evaluate( .operation() .ok_or("array has no executable primitive")?; match &*operation { + Operation::MoeSortedGather(kernel) => { + return kernel.evaluate(inputs, outputs); + } + Operation::MoeSortedCounts => { + return super::moe_sorted::counts_evaluate(inputs, &outputs[0]); + } Operation::Vision(k) => { return super::vision_kernels::evaluate(*k, inputs, &outputs[0]); } @@ -526,7 +537,7 @@ pub(super) fn evaluate( } return super::linear::evaluate(inputs, &outputs[0], *bits, *group); } - if let Operation::GatherQmmBf16 { + if let Operation::GatherQmm { bits, group, right_sorted, diff --git a/src/engine/metal/qwen_mtplx/policy.rs b/src/engine/metal/qwen_mtplx/policy.rs index 9bd2d3a..6d9fc58 100644 --- a/src/engine/metal/qwen_mtplx/policy.rs +++ b/src/engine/metal/qwen_mtplx/policy.rs @@ -25,6 +25,11 @@ fn falsey(value: Option<&str>) -> bool { }) } +pub(super) fn sorted_gather_enabled(get: impl Fn(&'static str) -> Option) -> bool { + !falsey(get("MTPLX_MOE_SORTED_GATHER_KERNEL").as_deref()) + && !truthy(get("MTPLX_FORCE_GPU_FAMILY_FALLBACK").as_deref()) +} + fn strict_bool(name: &str, raw: Option) -> Result { match raw .as_deref() @@ -323,3 +328,19 @@ fn qwen_server_policy_matches_original_functions() { } assert_eq!(count, 268); } + +#[test] +fn sorted_moe_switch_and_family_rehearsal() { + assert!(sorted_gather_enabled(|_| None)); + for off in ["0", " false ", "NO", "off"] { + assert!(!sorted_gather_enabled(|key| (key + == "MTPLX_MOE_SORTED_GATHER_KERNEL") + .then(|| off.to_owned()))); + } + for force in ["1", " true ", "YES", "on"] { + assert!(!sorted_gather_enabled(|key| (key + == "MTPLX_FORCE_GPU_FAMILY_FALLBACK") + .then(|| force.to_owned()))); + } + assert!(sorted_gather_enabled(|_| Some("unexpected".into()))); +} diff --git a/tools/issue112-extract-metal.py b/tools/issue112-extract-metal.py new file mode 100644 index 0000000..9005fdc --- /dev/null +++ b/tools/issue112-extract-metal.py @@ -0,0 +1,19 @@ +"""Regenerate only the vendored GPU shader closure from the pinned oracle.""" +import subprocess,sys +from pathlib import Path +checkout=Path(sys.argv[1]) +assert subprocess.check_output(['git','-C',str(checkout),'rev-parse','HEAD'],text=True).strip()=='9882703f3105363ddc37eca9f97aa09a1d387112' +sys.path.insert(0,str(checkout)) +import mlx.core as mx +from mtplx.kernels import moe_sorted_gather_nax as k +assert mx.__version__=='0.32.2' +root=k._include_root();seen=set();out=[] +for rel in (k._PREAMBLE_HEADER,*k._KERNEL_HEADERS):k._inline(root,rel,seen,out) +for rel,name in [('mlx/backend/metal/kernels/unary_ops.h','Sigmoid'),('mlx/backend/metal/kernels/binary_ops.h','Multiply')]: + functor=k._functor(root,rel,name) + assert functor is not None + out.append(functor) +metal=Path(__file__).resolve().parents[1]/'metal' +preamble='// MLX 0.32.2 GPU support, Copyright Apple Inc., MIT; see MLX-LICENSE.txt.\n// Flattened only the GPU header closure used by MTPLX 9882703 row-map gather.\n' +(metal/'mtplx-moe-sorted-header.metal').write_text(preamble+'\n'.join(out)+'\nusing namespace mlx::steel;\n') +(metal/'mtplx-moe-sorted-body.metal').write_text('// MTPLX 9882703, MIT; see MTPLX-LICENSE.txt.\n'+k._SOURCE) diff --git a/tools/issue112-installed-reference.py b/tools/issue112-installed-reference.py new file mode 100644 index 0000000..77bee00 --- /dev/null +++ b/tools/issue112-installed-reference.py @@ -0,0 +1,38 @@ +"""Installed gate/up row-map oracle, using the identical native fixture inputs.""" +import hashlib,json,subprocess,sys +from pathlib import Path +checkout,root,native=map(Path,sys.argv[1:4]) +assert subprocess.check_output(['git','-C',str(checkout),'rev-parse','HEAD'],text=True).strip()=='9882703f3105363ddc37eca9f97aa09a1d387112' +sys.path.insert(0,str(checkout)) +import mlx.core as mx +import numpy as np +from mtplx.kernels import moe_sorted_gather_nax as kernel +assert mx.__version__=='0.32.2' +index=json.loads((root/'model.safetensors.index.json').read_text())['weight_map'] +base='language_model.model.layers.0.mlp.switch_mlp.' +weights=mx.load(str(root/index[base+'gate_proj.weight'])) +def parts(proj):return [weights[base+proj+'.'+part] for part in ['weight','scales','biases']] +gate=parts('gate_proj');up=parts('up_proj') +gu=[mx.concatenate(a,axis=1) for a in zip(gate,up)] +mx.eval(*gu,*gate,*up) +def digest(a): + mx.eval(a) + return hashlib.sha256(np.asarray(a.view(mx.uint16)).tobytes()).hexdigest() +count=0 +for line in native.read_text().splitlines(): + if '"case":"installed_gate_up"' not in line:continue + case=json.loads(line[line.index('{'):]);count+=1 + tokens,rows=case['tokens'],case['rows'] + v=((np.arange(tokens*2560,dtype=np.uint32)*17+7*13)%257).astype(np.int32)-128 + x=mx.array((v.astype(np.float32)/128).reshape(tokens,1,2560)).astype(mx.bfloat16) + row_map=mx.arange(rows,dtype=mx.uint32)%tokens + ids=mx.array(np.arange(rows,dtype=np.uint32)*512//rows) + g,u=(gate,up) if case['separate'] else (gu,None) + kw=dict(group_size=64,bits=4,swiglu=True,up=u) + y=kernel.gather_rows_qmm(x,row_map,*g,ids,**kw) + stock=kernel._stock(x,row_map,*g,ids,**kw) + assert y is not None and digest(y)==digest(stock)==case['sha256'],case + print(json.dumps(dict(case='installed_oracle',native=case,exact=True,kernel=kernel.stats())),flush=True) + del x,row_map,ids,y,stock + mx.clear_cache() +assert count==12,count diff --git a/tools/issue112-model-reference.py b/tools/issue112-model-reference.py new file mode 100644 index 0000000..5300091 --- /dev/null +++ b/tools/issue112-model-reference.py @@ -0,0 +1,58 @@ +"""Pinned full-model cold/warm prefill, including explicit hidden-state capture.""" +import argparse,hashlib,json,os,subprocess,sys +from pathlib import Path +parser=argparse.ArgumentParser(description=__doc__) +for name in ['checkout','root','native','out']:parser.add_argument(name,type=Path) +parser.add_argument('--hidden',action='store_true') +a=parser.parse_args() +assert subprocess.check_output(['git','-C',str(a.checkout),'rev-parse','HEAD'],text=True).strip()=='9882703f3105363ddc37eca9f97aa09a1d387112' +sys.path.insert(0,str(a.checkout)) +from mtplx.server.openai import _server_runtime_env_overrides +os.environ.update(_server_runtime_env_overrides(argparse.Namespace(model=str(a.root),generation_mode='mtp' if a.hidden else 'ar'),None)) +os.environ['MTPLX_SUSTAINED_PREFILL']='1' +import mlx.core as mx +import numpy as np +from mlx_lm.utils import load_model +from mtplx.models import qwen4_exp +from mtplx.runtime import MTPLXRuntime,_load_tokenizer_resilient +from mtplx.sampling import SamplerConfig +from mtplx.generation import generate_ar,restore_or_prefill_prompt_state +from mtplx.cache_state import snapshot_cache,snapshot_cache_lazy_hybrid +from mtplx.session_bank import SessionBank,_lazy_snapshot_enabled +from mtplx.kernels import moe_sorted_gather_nax as kernel +assert mx.__version__=='0.32.2' +a.out.mkdir(parents=True,exist_ok=True) +model,config=load_model(a.root,lazy=False,strict=True,get_model_classes=lambda **_:(qwen4_exp.Model,qwen4_exp.ModelArgs)) +model.post_weight_load(a.root) +tokenizer=_load_tokenizer_resilient(a.root,config) +from mtplx.mtp_patch import MTPContract +if a.hidden: assert model.attach_mtp(a.root) +rt=MTPLXRuntime(model,tokenizer,a.root,a.hidden,MTPContract() if a.hidden else None) +def fingerprint(v): + values=np.asarray(v.astype(mx.float32)).astype('