diff --git a/.github/workflows/aurora-enhancements.yml b/.github/workflows/aurora-enhancements.yml index 1f60b9ce..5c751f98 100644 --- a/.github/workflows/aurora-enhancements.yml +++ b/.github/workflows/aurora-enhancements.yml @@ -9,6 +9,9 @@ on: - "mseries/aurora/release.json" - "mseries/aurora/enhancements/**" - "mseries/aurora/unified72/series.json" + - "mseries/aurora/unified72/egpu-series.json" + - "mseries/aurora/unified72/connectx-series.json" + - "mseries/aurora/unified72/combined-series.json" - "mseries/aurora/unified72/patches/**" - ".github/workflows/aurora-enhancements.yml" workflow_dispatch: @@ -16,7 +19,7 @@ on: profile: description: Kernel profile (eGPU remains an unqualified experiment) type: choice - options: [candidate, egpu, unified72] + options: [candidate, egpu, unified72, unified72-egpu, unified72-connectx, unified72-combined] default: candidate permissions: diff --git a/mseries/OS9-HANDOFF.md b/mseries/OS9-HANDOFF.md index b9bb6218..855f2ee9 100644 --- a/mseries/OS9-HANDOFF.md +++ b/mseries/OS9-HANDOFF.md @@ -1,3 +1,39 @@ +## Warren local AI and eGPU updates — 2026-10-30 + +Added `unified72-combined`, a distinct downstream kernel profile carrying #188 plus both AMDGPU and ConnectX Ethernet modules so one kernel can provide both. Source preparation, 12 PMP host tests, 88 Aurora tests and GCC olddefconfig passed. Native build pending. Existing eGPU trial remains staged; `/boot` has about 45 MiB free, insufficient for another Image plus initramfs without a storage plan. [Details](aurora/unified72/README.md#combined-egpu-and-connectx-package--october-30-2026). + +Owner clarified that upstream acceptance is not ours to duplicate; downstream regression testing and packaging are requested. Deployed official MLX v0.7.35 wheel (`39671c8a...19fba82`) to the live venv with the previous venv retained at `~/.local/share/mlx-omarchy/venv.before-v0.7.35-20261030`. Qwen 2B baseline/work120k gate passed; Granite 1B short text matched earlier baseline; reply service restarted and returned `ready`, expected private ICD and server patches checked. Installer/source pins now target `42b30a2d`. [Receipt](local-ai/receipts/2026-10-30-mlx-v0735-deploy/README.md). + +Installed the eGPU kernel package and Ubuntu AMD graphics firmware; staged `elementary-aurora72-egpu-test-trial` with 91-module audited wip5-derived initramfs. GRUB syntax passes, one-shot is empty, current wip5 remains running; shared boot.bin remains unchanged and its old PCI ranges still apply to tunnels 1–3. No eGPU is attached. [Deployment details](aurora/unified72/README.md#separate-egpu-candidate--october-30-2026). + +Long Qwen 2B divergence investigated with the exact 256-token installed-MLX sequence, a CPU float32 teacher-forced forward and two TensorFold probe runs. One TensorFold selection differs at zero-based row 167; its ` This` instead of MLX incremental ` Red` aligns with the 880-character common prefix. CPU prefers ` Red` by 0.08872; TensorFold BF16 ties at 20.125 and picks ` This`, as does a separate MLX full-pass teacher-forced forward. TF/CPU RMSE 0.02758, MLX/CPU 0.02963; each has only this near-tie CPU argmax difference. Strict exact-ID probe fails; this supports but does not prove the numerical cause. [Receipt](local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/README.md). + +Aurora eGPU CI run 41048473839 passed. The downloaded ZIP matched GitHub digest and all payload checksums passed; package `e15886c7...8923763` contains AMDGPU with matching vermagic and expected J314S DTB, no /boot payload. No installation or boot; firmware and shared-DTB fallback compatibility remain open. [Receipt](aurora/unified72/egpu-ci-2026-10-30.json). + +Extended TensorFold #1544 `b3ab9ba` CPU-float32 teacher-forced comparison to all six cached 32-step cases. Pooled RMSE ratio to installed MLX 0.967 (1.05 bound); max case ratio 1.049 (1.15 bound); all finite and no argmax flips outside 0.5-margin near ties. The stricter TensorFold probe **failed exact IDs** on `single` row 24 (CPU margin 0.0041) and `code` row 16 (0.10039); other four passed. Each repeat matched its own logits. These are numerical checks, not complete free-running, long-context or FP64 qualification. [Receipt](local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/README.md). + +TensorFold #1544 `b3ab9ba` teacher-forced short rainbow case: two runs matched all 32 CPU-reference IDs and repeated logits byte-for-byte; BF16 logits versus the cached float32 CPU rows had RMSE 0.02884 versus installed MLX 0.03183 (ratio 0.906, within 1.15 case bound), with 6,437,111 unequal BF16 elements against rounded CPU logits. One case only, not the FP64 gate or an explanation of long divergence. [Receipt](local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/README.md). + +TensorFold #1544 head `b3ab9ba` long Qwen 2B follow-up: one guarded 256-token pair completed, but its text diverged from installed MLX after 880 common characters, matching the earlier trial's divergence position. This is a text comparison, not a logits diagnosis; teacher-forced fidelity and batching remain open. [Receipt](local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/README.md). + +Tested TensorFold draft #1544 head `b3ab9ba` privately: host tests, all five M1 Pro GPU stages and six contract groups pass (pointwise records known fp32 denormal flush). Qwen 2B 32-token, three rotated rounds matched installed MLX's response text; TensorFold loopback median 2.89 decode tokens/s versus MLX in-process 54.51, with different timing boundaries. Long-output fidelity, desktop pacing and submit-batching remain unqualified; no service changed. [Receipt](local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/README.md). + +The installed system has no `/usr/lib/firmware/amdgpu` and no Ubuntu `linux-firmware` package; identify and verify matching card firmware before any AMD eGPU trial. The local ConnectX module compile required `rustup component add rust-src --toolchain 1.93.1`; this adds build-tool source only and does not alter the running kernel. + +Local GCC compilation of ConnectX `mlx5_core` and `mlxfw` completed with `KBUILD_MODPOST_WARN=1` and no kernel `Module.symvers`: unresolved-symbol warnings and missing BTF mean compile-only evidence, not loadable artifacts. The diagnostic build changed the private prepared source tree; prepare a fresh tree for its digest gate. The separate ConnectX CI build remains in progress. + +Added an isolated `unified72-connectx` kernel profile on wip5 source with Mellanox support and Ethernet enabled (`MLX5_CORE=m`, `MLX5_CORE_EN=y`, `MLXFW=m`); AMDGPU and RDMA remain off. Source preparation, the 12 PMP tests, GCC olddefconfig and 87 Aurora tests pass. No ConnectX adapter is present, and build/boot/link/throughput are unqualified. [Details](aurora/unified72/README.md#separate-connectx-candidate--october-30-2026). + +Compiled the #188 J314S DTB locally and compared its decompiled contents with wip5: only the three expected PCI ranges differ. Added `prepare-egpu-boot-candidate.py` to create an uninstalled image from the existing shared boot payload by changing only those three DTB bytes, checking the exact input hash and preserving all other boot bytes. The private candidate is `fe7ad1e9...8539913`; 86 Aurora tests pass. This does not establish compatibility with fallback kernels or any eGPU boot, and no boot file was changed. [Details](aurora/unified72/README.md#separate-egpu-candidate--october-30-2026). + +Follow-up: a real-device QMV toggle probe mapped candidate dispatch ID 547 to the batch route, and the separate candidate batch-4 model trace contains 3,366 such dispatches; the installed baseline probe and batch-4 trace show the same route and dispatch count. Live J314S DTB still has the pre-#188 non-identity PCI windows on tunnels 1–3, and shared `boot.bin` matches the retained fallback hash. The package DTB alone does not alter that boot tree; preserve fallback compatibility before staging a trial. + +Built MLX #303 merge `42b30a2` in an isolated venv; installed v0.7.34 and candidate both passed the Qwen 2B single-stream gate. Three alternating batch pairs per size produced matching token hashes, median paired reductions 8.7% (batch 2), -3.1% (batch 3) and 8.0% (batch 4). This is a short smoke; serving fidelity and desktop pacing remain unqualified. No live runtime replaced. [Receipt](local-ai/receipts/2026-10-30-qmv-batch/README.md). + +Added a separate `unified72-egpu` build profile at Aurora #188 merge `c506e1c3` with wip5's five display patches and AMDGPU=m. Archive verification, patch preparation, 12 PMP host tests and GCC olddefconfig passed; local LLVM configuration lacked lld. The profile is experimental and unbuilt/unbooted, with no attached eGPU. See [candidate details](aurora/unified72/README.md#separate-egpu-candidate--october-30-2026). + +Audited the linked announcement against the running wip5 host and current dev pins. TensorFold's merged Vulkan base is not yet a model engine; MLX #303 needs M1 Pro batch qualification; Aurora #188 merged after our source pin and changes shared PCI/DTB behavior. No external GPU or ConnectX appeared in the PCI inventory. No runtime, kernel or boot changes were made. See [the source and qualification notes](local-ai/WARREN-UPSTREAM-2026-10-30.md). + ## Rust compositor: frames for X11 windows — 2026-10-29 Owner report: the WiFiman Desktop window (Electron, X11, `_MOTIF_WM_HINTS 0x2, 0x0, 0x1`, min 420x460) could not be moved or resized. The Rust compositor drew no server-side decorations at all, so X11 apps that rely on the window manager's title bar had nothing to grab. New `rust/pantheon-compositor/src/decorations.rs`: X11 windows that ask for a frame (no Motif hints, or hints with a title; normal/dialog/utility types) get a 34 px title bar above the client, an invisible 8 px resize band, and the `org.gnome.desktop.wm.preferences button-layout` buttons (close, minimize, maximize; the owner's `close,minimize,maximize:`), drawn with pango/cairo and rounded with the window corners. Drag moves, edges resize within the size hints, double-click and the maximize button toggle maximize, close sends WM_DELETE_WINDOW. Snapped/maximized framed windows are configured below the title bar; work-area fitting counts the title bar. Fixes on the way: X11 resize ignored WM_NORMAL_HINTS min/max; moving an X11 window (title bar or Super-drag) never told the client its new position. `_NET_WM_MOVERESIZE` was already routed by smithay and is now covered by the probe. Wayland windows, header-bar (CSD) X11 windows and fullscreen windows are unchanged. Verified: `mseries/pantheon-rust-compositor/ssd-probe/run.sh` (nested, 11/11 pass with a window carrying WiFiman's exact hints), 184 unit tests, activation probe 7/7. Not verified: the real WiFiman window on the M1 Pro (needs the owner's install + re-login); the real app was not started nested because its root daemon carries the owner's live VPN. Not done: `_NET_FRAME_EXTENTS`, a window shadow, frames during gesture animations. diff --git a/mseries/ROADMAP.md b/mseries/ROADMAP.md index e154c8a1..32d10102 100644 --- a/mseries/ROADMAP.md +++ b/mseries/ROADMAP.md @@ -5640,3 +5640,10 @@ remains open. The current live site byte-matches `dev` `7053069f` from Pages run ## T3 launcher and panel decision (2026-10-27) Keep the unified T3 Wingpanel menu and use the Dock launcher to open the T3 window. Validate the combined experience on the target desktop before claiming acceptance. +# 2026-10-30 eGPU candidate + +The separate Aurora `unified72-egpu` profile carries upstream #188 with AMDGPU enabled. Its CI-built package and AMD firmware are installed, and a non-default trial entry is staged; running wip5 and shared boot DTB remain in place. J314S dock, recovery, matched-DTB and actual eGPU testing remain. See [candidate status](aurora/unified72/README.md#separate-egpu-candidate--october-30-2026). + +The separate `unified72-connectx` profile enables the Mellanox Ethernet module on wip5 source; it requires a native build and real-adapter link and throughput qualification. [Status](aurora/unified72/README.md#separate-connectx-candidate--october-30-2026). + +The `unified72-combined` profile packages both driver sets in one kernel; native build, boot-space planning and device regression tests remain. [Status](aurora/unified72/README.md#combined-egpu-and-connectx-package--october-30-2026). diff --git a/mseries/aurora/candidate.py b/mseries/aurora/candidate.py index c8b3f242..4f404eb3 100644 --- a/mseries/aurora/candidate.py +++ b/mseries/aurora/candidate.py @@ -145,7 +145,10 @@ def tree_digest(root): def manifest(profile): - return HERE / "unified72/series.json" if profile == "unified72" else MANIFEST + return (HERE / "unified72" / {"unified72": "series.json", + "unified72-egpu": "egpu-series.json", "unified72-connectx": "connectx-series.json", + "unified72-combined": "combined-series.json"}[profile] + if profile in ("unified72", "unified72-egpu", "unified72-connectx", "unified72-combined") else MANIFEST) def series(profile="candidate"): @@ -163,8 +166,10 @@ def settings(data, profile): result = dict(data["config"]["candidate"]) # Explicitly retain the release's disabled eGPU drivers in the normal candidate. result.update(DRM_AMDGPU="n", DRM_NOUVEAU="n") - if profile == "egpu": + if profile in ("egpu", "unified72-egpu", "unified72-combined"): result.update(data["config"]["egpu"]) + if profile == "unified72-connectx": + result.update(data["config"]["connectx"]) result.update(LOCALVERSION='""', LOCALVERSION_AUTO="n") return result @@ -304,7 +309,7 @@ def check(root): binary = Path(temporary) / f"production-tests-{index}" run("rustc", "--edition=2021", "--test", "-D", "warnings", source / test, "-o", binary, cwd=root) run(binary) - if receipt["profile"] != "unified72": + if receipt["profile"] not in ("unified72", "unified72-egpu", "unified72-connectx", "unified72-combined"): run("python3", ENHANCEMENTS / "check-macsmc.py", source) @@ -400,7 +405,7 @@ def main(): prep = commands.add_parser("prepare") prep.add_argument("--cache", type=Path, required=True) prep.add_argument("--output", type=Path, required=True) - prep.add_argument("--profile", choices=("candidate", "egpu", "unified72"), default="candidate") + prep.add_argument("--profile", choices=("candidate", "egpu", "unified72", "unified72-egpu", "unified72-connectx", "unified72-combined"), default="candidate") prep.add_argument("--offline", action="store_true") for command in ("check", "build"): sub = commands.add_parser(command) diff --git a/mseries/aurora/test_egpu_boot_candidate.py b/mseries/aurora/test_egpu_boot_candidate.py new file mode 100644 index 00000000..b92d9c5d --- /dev/null +++ b/mseries/aurora/test_egpu_boot_candidate.py @@ -0,0 +1,43 @@ +"""Safety checks for the uninstalled eGPU boot payload builder.""" +import importlib.util +from pathlib import Path +import struct +import unittest + +path = Path(__file__).parent / 'unified72/prepare-egpu-boot-candidate.py' +spec = importlib.util.spec_from_file_location('egpu_boot', path) +egpu = importlib.util.module_from_spec(spec) +spec.loader.exec_module(egpu) + + +def tree(payload): + size = 40 + len(payload) + return b'\xd0\x0d\xfe\xed' + struct.pack('>I', size) + bytes(32) + payload + + +def fixture(): + ranges = b''.join(struct.pack('>7I', 0x43000000, 8, 0, h, 0, 2, 0) + for h in (12, 16, 20)) + return b'loader' + tree(b'apple,j314s\0' + ranges) + b''.join(tree(bytes([i])) for i in range(8)) + b'payload' + + +class CandidateTest(unittest.TestCase): + def test_only_three_expected_bytes_change(self): + data = fixture() + new, receipt = egpu.compose(data) + self.assertEqual(len(data), len(new)) + self.assertEqual(sum(a != b for a, b in zip(data, new)), 3) + self.assertEqual(receipt['dtb_count'], 9) + self.assertTrue(new.endswith(b'payload')) + + def test_missing_or_duplicate_ranges_are_refused(self): + data = fixture() + needle = struct.pack('>7I', 0x43000000, 8, 0, 12, 0, 2, 0) + with self.assertRaisesRegex(ValueError, 'unexpected or ambiguous'): + egpu.compose(data.replace(needle, bytes(len(needle)))) + with self.assertRaisesRegex(ValueError, 'unexpected or ambiguous'): + egpu.compose(data.replace(bytes(32), needle + bytes(4), 1)) + + +if __name__ == '__main__': + unittest.main() diff --git a/mseries/aurora/test_qualification.py b/mseries/aurora/test_qualification.py index 439acf3e..8fbe3f2e 100644 --- a/mseries/aurora/test_qualification.py +++ b/mseries/aurora/test_qualification.py @@ -218,6 +218,45 @@ def test_journal_from_a_different_boot_is_refused(self): with self.assertRaisesRegex(ValueError, "exactly the observed boot"): self.collect_fixture(["PMP started"], "other-boot") + def test_unified72_combines_egpu_and_connectx_without_overwriting_either(self): + data = candidate.series("unified72-combined") + egpu = candidate.series("unified72-egpu") + connectx = candidate.series("unified72-connectx") + self.assertEqual(data["source"]["commit"], egpu["source"]["commit"]) + self.assertNotIn(data["debian_package"], (egpu["debian_package"], connectx["debian_package"])) + config = candidate.settings(data, "unified72-combined") + self.assertEqual(config["DRM_AMDGPU"], "m") + self.assertEqual(config["MLX5_CORE"], "m") + self.assertEqual(config["MLX5_CORE_EN"], "y") + self.assertEqual(config["MLXFW"], "m") + self.assertEqual(config["DRM_NOUVEAU"], "n") + self.assertEqual([p["sha256"] for p in data["patches"]], + [p["sha256"] for p in egpu["patches"]]) + + def test_unified72_connectx_is_separate_and_enables_ethernet(self): + normal = candidate.series("unified72") + connectx = candidate.series("unified72-connectx") + self.assertNotEqual(normal["debian_package"], connectx["debian_package"]) + self.assertEqual(normal["source"]["commit"], connectx["source"]["commit"]) + self.assertEqual(candidate.settings(connectx, "unified72-connectx")["MLX5_CORE"], "m") + self.assertEqual(candidate.settings(connectx, "unified72-connectx")["MLX5_CORE_EN"], "y") + self.assertEqual(candidate.settings(connectx, "unified72-connectx")["MLXFW"], "m") + self.assertEqual(candidate.settings(connectx, "unified72-connectx")["DRM_AMDGPU"], "n") + self.assertNotIn("MLX5_CORE", candidate.settings(normal, "unified72")) + + def test_unified72_egpu_is_separate_and_enables_amd_only_in_its_profile(self): + normal = candidate.series("unified72") + egpu = candidate.series("unified72-egpu") + self.assertNotEqual(normal["debian_package"], egpu["debian_package"]) + self.assertNotEqual(normal["kernel_release"]["unified72"], + egpu["kernel_release"]["unified72-egpu"]) + self.assertEqual(candidate.settings(normal, "unified72")["DRM_AMDGPU"], "n") + self.assertEqual(candidate.settings(egpu, "unified72-egpu")["DRM_AMDGPU"], "m") + self.assertEqual(candidate.settings(egpu, "unified72-egpu")["DRM_NOUVEAU"], "n") + self.assertIn(egpu["source"]["commit"], egpu["source"]["url"]) + self.assertEqual([p["sha256"] for p in normal["patches"]], + [p["sha256"] for p in egpu["patches"]]) + def test_unified72_snapshot_has_separate_identity_and_no_moving_branch_url(self): data = candidate.series("unified72") self.assertIn(data["source"]["commit"], data["source"]["url"]) diff --git a/mseries/aurora/unified72/README.md b/mseries/aurora/unified72/README.md index 73fd67fe..c2ba82e6 100644 --- a/mseries/aurora/unified72/README.md +++ b/mseries/aurora/unified72/README.md @@ -1,5 +1,33 @@ # Unified Aurora 7.2.10 build candidate +## Combined eGPU and ConnectX package — October 30, 2026 + +`unified72-combined` builds one distinct kernel from the #188 merge and the wip5 display patch series, with both `DRM_AMDGPU=m` and ConnectX Ethernet (`MLX5_CORE=m`, `MLX5_CORE_EN=y`, `MLXFW=m`). RDMA and Nouveau are not enabled by this profile. The original individual profiles remain available and do not share its package or kernel identity. Source preparation and the 12 PMP host tests passed, all 88 Aurora unit tests passed, and a local GCC `olddefconfig` retained both driver sets and 16K pages. The native [package build](https://github.com/techmore/ElementaryOS_MSeries/actions/runs/41057113100) was submitted at `f70f5cc8`; hardware checks are separate. The existing eGPU trial stays staged; only about 45 MiB remains on `/boot`, so adding another boot entry requires a storage plan rather than removing existing recovery files. + +## Separate ConnectX candidate — October 30, 2026 + +The running wip5 kernel has `NET_VENDOR_MELLANOX` disabled. `connectx-series.json` defines an independent `unified72-connectx` candidate on the same wip5 source and five display patches, with `NET_VENDOR_MELLANOX=y`, `MLX5_CORE=m`, `MLX5_CORE_EN=y` and `MLXFW=m`. AMDGPU remains off; RDMA is not enabled by this profile. It has its own package and kernel identity; it does not replace the wip5 or eGPU profiles. The author reports that a ConnectX-5 Ex enumerated on M2 Max without special PCI or DT changes; that result is not a J314S or network throughput qualification ([setup](https://github.com/joshuaswarren/omarchy-egpu/blob/main/cards/connectx-5/README.md)). + +Pinned source verification, patch preparation and 12 PMP host tests passed. A GCC `olddefconfig` retained all four ConnectX settings and 16K pages. The native LLVM kernel and module build, boot, an attached adapter, link stability and throughput remain untested. No ConnectX card appeared in this machine's PCI inventory. The Aurora workflow's manual `unified72-connectx` profile was submitted as [CI run 41049918349](https://github.com/techmore/ElementaryOS_MSeries/actions/runs/41049918349), queued behind the eGPU build. Do not promote it from configuration checks alone. + +An additional local GCC compile of `mlx5_core` and `mlxfw` completed after `modules_prepare`. It used `KBUILD_MODPOST_WARN=1` without a full-kernel `Module.symvers`, so modpost reported unresolved symbols and skipped BTF: this proves source compilation only, not link or load compatibility. These private build outputs must not be installed or loaded. The diagnostic build wrote into the prepared source directory, invalidating its recorded source-tree digest; create a fresh prepared tree for any subsequent `candidate.py check` or full build. Logs remain in `~/.cache/mseries-connectx-20261030/`. + +## Separate eGPU candidate — October 30, 2026 + +`egpu-series.json` pins Aurora #188 merge `c506e1c3c1d7808eddc251e3029b72e9f17e00df`, whose first parent is the wip5 source, and retains its five local display patches. The `unified72-egpu` profile has a distinct package and modules identity and requests AMDGPU as a module; the existing `unified72` profile remains unchanged. It does not enable Nouveau. Prepare with `python3 mseries/aurora/candidate.py prepare --profile unified72-egpu --cache CACHE --output OUTPUT`, then run `candidate.py check --prepared OUTPUT`. The Aurora workflow offers this profile through manual dispatch. + +The pinned archive checksum, all five ordered patch applications and 12 production PMP host tests passed locally. A GCC `olddefconfig` retained `DRM_AMDGPU=m`, `DRM_AMD_DC=y`, `DRM_AMD_DC_FP=y`, and 16K pages; the local LLVM attempt lacked a working lld; the later native CI LLVM build passed. No eGPU is attached here. Source preparation alone does not qualify boot, dock, shared-DTB recovery or hotplug behavior. The updated T600x PCI ranges require a matched boot-chain review before use. + +On 2026-10-30 the live `/proc/device-tree` confirmed the shared boot DTB still has PCI high address `0x8` on tunnels 0–3, with CPU high addresses `0x8`, `0xc`, `0x10`, `0x14` respectively. #188 changes the PCI addresses for tunnels 1–3 to match their CPU addresses. The shared `/boot/m1n1/boot.bin` SHA-256 is `9c9c2d01c3bdb2784daf99cecd6f0e2327eb8f148ea43c8e522e5bae09a14d5f`, matching the documented retained fallback. Therefore the new package's DTBs alone cannot change the currently selected boot tree; updating the shared payload could also change the DTB supplied to older recovery kernels. A per-kernel or fallback-compatible boot path must be designed and verified before an eGPU trial. + +The locally compiled candidate `t6000-j314s.dtb` (GCC config check, SHA-256 `7f515974eb466d075e94d435c58543e3c30b1da3bd02d5f6dcf5d067e5747698`) decompiles with only those three range changes compared with the installed wip5 package DTB (`2ca125477252e4753e8168567af99dda592bce6dea94235677d212846f49ae4c`). Separately, `prepare-egpu-boot-candidate.py` constructs a private boot image by changing those exact three bytes in the existing shared J314S tree, rather than substituting the newer packaged tree. It verifies an explicit input hash, unique expected ranges, an unchanged 110-tree structure and byte-identical data outside the target tree; it refuses `/boot` output and overwriting files. Against the current payload it produced `~/.cache/mseries-aurora-egpu-20261030/boot.bin.script-candidate`, SHA-256 `fe7ad1e9fe54591a0e85c7e05ecb063778ffbb0359d9c6d2b57939f398529913`. Decompilation confirms only the three PCI range changes; a separately constructed candidate was byte-identical. This is **uninstalled and unbooted**: it is still a shared payload and does not establish compatibility with wip4, .20 or rescue, nor does it validate hardware eGPU access. The 86 Aurora unit tests include missing and ambiguous range refusals. The native [CI build](https://github.com/techmore/ElementaryOS_MSeries/actions/runs/41048473839) succeeded and produced the separately inspected kernel artifact; the local DTB-only compilation was not used as its source. + +Installed the payload and staged non-default GRUB entry `elementary-aurora72-egpu-test-trial` on 2026-10-30. The wip5 initramfs was retargeted and its early archive, non-module entries, dependencies and 91 module bytes passed the trial audit. Staged Image SHA-256 `d83db5e28c487058a4338df072fa55d58e43d34c190045d0d0c02aff00ac769a`; initramfs SHA-256 `666aeae9216decec353833b4828386094fd61f4ee12aad1fa1c0ee2d6363eb80`. Backup: `/var/lib/mseries-kernel-tests/staging/20261030T123209Z-aurora72-egpu-test`. GRUB syntax passed, one-shot is empty, and the current running kernel remains wip5. The shared boot DTB remains unchanged, so the new PCI ranges are not active on tunnels 1–3. + +The eGPU native ARM64 [CI build and payload inspection](https://github.com/techmore/ElementaryOS_MSeries/actions/runs/41048473839) passed at project commit `ad58f2d8`. The downloaded ZIP digest matches GitHub (`6df3e978...cbb35`); every `SHA256SUMS` entry verified. The distinct package contains AMDGPU with matching vermagic, a kernel Image, the expected J314S DTB and no `/boot` payload. Package SHA-256 is `e15886c71ec6189eefbf82a9283674ebb17962db62fa68f2421aca0680923763`; [inspection receipt](egpu-ci-2026-10-30.json). It is installed and staged as a non-default trial; it has not been booted, and no eGPU hardware trial is recorded. + +Ubuntu `linux-firmware-amd-graphics` version `20260319.git217ca6e4-0ubuntu3.1` was installed on 2026-10-30 (package SHA-256 `8a25052f6e9560dd7d3035a67e9edb1290d72ac0e7208908399702f8c860e586`); the package supplies compressed AMD firmware and its copyright file, and the candidate kernel enables zstd firmware decompression. No eGPU card is connected and firmware loading remains untested. The package's initramfs trigger reported “Not updating initramfs.” + ## wip5 revision 7 — October 29, 2026 (booted on the J314S; install record in [wip5/README.md](wip5/README.md)) The owner chose this re-pin. **Revision 7 pins `7.2.11-elementary-aurora72-wip5`**: merged omacom diff --git a/mseries/aurora/unified72/combined-series.json b/mseries/aurora/unified72/combined-series.json new file mode 100644 index 00000000..2cadbe48 --- /dev/null +++ b/mseries/aurora/unified72/combined-series.json @@ -0,0 +1,93 @@ +{ + "schema": 1, + "base_source": "c46d7dcdb8712ea9aeb0ce47b439ffae76371e55", + "revision": 1, + "source": { + "repository": "omacom/linux-aurora", + "commit": "c506e1c3c1d7808eddc251e3029b72e9f17e00df", + "git_url": "https://github.com/omacom/linux-aurora.git", + "git_tree_sha1": "0d623a83778ca41725417a7716e0399932bc5405", + "upstream_pr": "https://github.com/omacom/linux-aurora/pull/188", + "upstream_ref": "PR #188 merge; first parent is the wip5 source", + "name": "linux-aurora-c506e1c3c1d7808eddc251e3029b72e9f17e00df.tar.gz", + "url": "https://codeload.github.com/omacom/linux-aurora/tar.gz/c506e1c3c1d7808eddc251e3029b72e9f17e00df", + "archive_root": "linux-aurora-c506e1c3c1d7808eddc251e3029b72e9f17e00df", + "sha256": "13cfc68aa95ffd0ac858e1a57d95691a10499a4800f3a8ae6deefc7394f238e2" + }, + "kernel_release": { + "unified72-combined": "7.2.11-elementary-aurora72-combined-test" + }, + "debian_package": "linux-image-elementary-aurora72-combined-test", + "debian_version": "7.2.11+elementary.aurora72.combined.test-1", + "patches": [ + { + "file": "0001-drm-apple-srgb-external-display-colour.patch", + "sha256": "6dc8aadcdc0c7c39710d3b9164c388f11b0b2fa111b73e8e14a63bb759ba8fe1", + "upstream": "https://github.com/omacom/linux-aurora/pull/157", + "head": "9d3aeb24cb864d5f99a7172e9004884bf3c1a9a0", + "profile": "candidate", + "note": "drm/apple: sRGB surfaces and an sRGB link colorimetry for external displays (unmerged upstream PR #157, 5 files, +73/-6). Rebased for wip5 (context only; previous sha256 9cd617e413c69006349e8ffa914ee0c16d1d7ba246d5afd9e1031aafbbf09573): the dcp-internal.h hunk now sits above the new dcp-panel-edid.h include and the plane.c hunk moved +194 lines after upstream's plane-layout rewrite. Added and removed lines are unchanged. Must be re-checked if #157 moves." + }, + { + "file": "0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch", + "sha256": "fdd6f9cd13ca90b4500130d289182eb69728e25afe5a5ed3f0c92571aa54fd1a", + "upstream": null, + "head": null, + "profile": "candidate", + "note": "drm/apple: local, not upstream. A DCP whose DPTX RemotePort times out is passed over for 300 s, and a timed-out release no longer pins the port's DP tunnel route to it. Applies after 0001 to the #158 source (checked against the exact files; full-tree apply is checked by candidate.py prepare and CI). Never built or booted." + }, + { + "file": "0003-drm-apple-dcp-let-a-typec-port-with-hpd-take-over-a-held-pipeline.patch", + "sha256": "2273d0ee008bafc702358bfc553ecfdd8cd9ea8d665c4ce5fb2b3b36af4f9111", + "upstream": "https://github.com/omacom/linux-aurora/pull/186", + "head": "4da4932b130b21d7367d56859f558c4e8a8f101f", + "profile": "candidate", + "note": "drm/apple: dcp: let a Type-C port with HPD take over a pipeline held without it (omacom/linux-aurora PR #186 commit 1/3, author-reported on an M1 Pro J314s). Unmerged upstream; not reviewed upstream." + }, + { + "file": "0004-drm-apple-dcp-route-a-dp-alt-port-only-once-its-sink-asserts-hpd.patch", + "sha256": "111a8d0d4edca05367301e8e1afc3a487bf1638b015073ea81ae64cd1d4817ec", + "upstream": "https://github.com/omacom/linux-aurora/pull/186", + "head": "bd1ad7b9b2795b7d3b3c7e616a54b78f9c92c6e0", + "profile": "candidate", + "note": "drm/apple: dcp: route a DP-alt port only once its sink asserts HPD (PR #186 commit 2/3). Its message reports that routing before HPD left the DPTX service on that DCP answering -110 until reboot, the symptom seen on dcpext1 (28cc00000) here." + }, + { + "file": "0005-usb-typec-tipd-treat-enospc-as-a-taken-display-on-every-soc.patch", + "sha256": "f6c63701d3197204abd1f3c3bd9fb9c44a0a7156afdd63cba2feb04c5522c037", + "upstream": "https://github.com/omacom/linux-aurora/pull/186", + "head": "2a37f6f206456462970b3bbb3bf9bf8bd8944acd", + "profile": "candidate", + "note": "usb: typec: tipd: treat -ENOSPC as a taken display on every SoC (PR #186 commit 3/3). Overlaps unmerged PR #163, which fixes the same bug by changing the cd321x_display_taken() signature; the two conflict, so only this one is carried." + } + ], + "config": { + "candidate": { + "UDMABUF": "y", + "DMABUF_HEAPS": "y", + "DMABUF_HEAPS_SYSTEM": "y" + }, + "egpu": { + "DRM_AMDGPU": "m", + "NET_VENDOR_MELLANOX": "y", + "MLX5_CORE": "m", + "MLX5_CORE_EN": "y", + "MLXFW": "m" + } + }, + "host_tests": [ + "tools/asahi/pmp-bootargs-tests.rs", + "tools/asahi/pmp-power-tests.rs" + ], + "qualification": "Combined downstream candidate: Aurora #188 merge and wip5 display patches, AMDGPU and ConnectX Ethernet modules enabled. Build, boot, shared-DTB fallback, dock and adapter testing remain separate.", + "superseded_patches": [ + { + "file": "0001-stock-bindgen-layout-policy.patch", + "sha256": "bba23efd3298c7f4fba31bde6a7a798b73fcbce7d07cb87683422d429615dedd", + "upstream": "https://github.com/omacom/linux-aurora/commit/4c56f9cd3033e5f65ef9c61bc7b396d50bce23f7", + "head": "4c56f9cd3033e5f65ef9c61bc7b396d50bce23f7", + "profile": "candidate", + "note": "Historical local port for wip1; corresponding stock-bindgen default and BINDGEN_LAYOUT_TESTS opt-in are now carried in merged upstream source. Retained for provenance; not applied to wip2." + } + ] +} diff --git a/mseries/aurora/unified72/connectx-series.json b/mseries/aurora/unified72/connectx-series.json new file mode 100644 index 00000000..6c02278c --- /dev/null +++ b/mseries/aurora/unified72/connectx-series.json @@ -0,0 +1,92 @@ +{ + "schema": 1, + "base_source": "c46d7dcdb8712ea9aeb0ce47b439ffae76371e55", + "revision": 1, + "source": { + "repository": "omacom/linux-aurora", + "commit": "2f725546d6ac6afe0bd5abfa1a844971519f0076", + "git_url": "https://github.com/omacom/linux-aurora.git", + "git_tree_sha1": "1702c514fd6373bd0a81846c28dd1c030ebd663c", + "upstream_pr": null, + "upstream_ref": "integration/aurora (head on 2026-10-29; contains merged #158)", + "name": "linux-aurora-2f725546d6ac6afe0bd5abfa1a844971519f0076.tar.gz", + "url": "https://codeload.github.com/omacom/linux-aurora/tar.gz/2f725546d6ac6afe0bd5abfa1a844971519f0076", + "archive_root": "linux-aurora-2f725546d6ac6afe0bd5abfa1a844971519f0076", + "sha256": "3f1b9cd779cc4ff94b8ff0575388223e1da0894160763133eb6b836352272bad" + }, + "kernel_release": { + "unified72-connectx": "7.2.11-elementary-aurora72-connectx-test" + }, + "debian_package": "linux-image-elementary-aurora72-connectx-test", + "debian_version": "7.2.11+elementary.aurora72.connectx.test-1", + "patches": [ + { + "file": "0001-drm-apple-srgb-external-display-colour.patch", + "sha256": "6dc8aadcdc0c7c39710d3b9164c388f11b0b2fa111b73e8e14a63bb759ba8fe1", + "upstream": "https://github.com/omacom/linux-aurora/pull/157", + "head": "9d3aeb24cb864d5f99a7172e9004884bf3c1a9a0", + "profile": "candidate", + "note": "drm/apple: sRGB surfaces and an sRGB link colorimetry for external displays (unmerged upstream PR #157, 5 files, +73/-6). Rebased for wip5 (context only; previous sha256 9cd617e413c69006349e8ffa914ee0c16d1d7ba246d5afd9e1031aafbbf09573): the dcp-internal.h hunk now sits above the new dcp-panel-edid.h include and the plane.c hunk moved +194 lines after upstream's plane-layout rewrite. Added and removed lines are unchanged. Must be re-checked if #157 moves." + }, + { + "file": "0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch", + "sha256": "fdd6f9cd13ca90b4500130d289182eb69728e25afe5a5ed3f0c92571aa54fd1a", + "upstream": null, + "head": null, + "profile": "candidate", + "note": "drm/apple: local, not upstream. A DCP whose DPTX RemotePort times out is passed over for 300 s, and a timed-out release no longer pins the port's DP tunnel route to it. Applies after 0001 to the #158 source (checked against the exact files; full-tree apply is checked by candidate.py prepare and CI). Never built or booted." + }, + { + "file": "0003-drm-apple-dcp-let-a-typec-port-with-hpd-take-over-a-held-pipeline.patch", + "sha256": "2273d0ee008bafc702358bfc553ecfdd8cd9ea8d665c4ce5fb2b3b36af4f9111", + "upstream": "https://github.com/omacom/linux-aurora/pull/186", + "head": "4da4932b130b21d7367d56859f558c4e8a8f101f", + "profile": "candidate", + "note": "drm/apple: dcp: let a Type-C port with HPD take over a pipeline held without it (omacom/linux-aurora PR #186 commit 1/3, author-reported on an M1 Pro J314s). Unmerged upstream; not reviewed upstream." + }, + { + "file": "0004-drm-apple-dcp-route-a-dp-alt-port-only-once-its-sink-asserts-hpd.patch", + "sha256": "111a8d0d4edca05367301e8e1afc3a487bf1638b015073ea81ae64cd1d4817ec", + "upstream": "https://github.com/omacom/linux-aurora/pull/186", + "head": "bd1ad7b9b2795b7d3b3c7e616a54b78f9c92c6e0", + "profile": "candidate", + "note": "drm/apple: dcp: route a DP-alt port only once its sink asserts HPD (PR #186 commit 2/3). Its message reports that routing before HPD left the DPTX service on that DCP answering -110 until reboot, the symptom seen on dcpext1 (28cc00000) here." + }, + { + "file": "0005-usb-typec-tipd-treat-enospc-as-a-taken-display-on-every-soc.patch", + "sha256": "f6c63701d3197204abd1f3c3bd9fb9c44a0a7156afdd63cba2feb04c5522c037", + "upstream": "https://github.com/omacom/linux-aurora/pull/186", + "head": "2a37f6f206456462970b3bbb3bf9bf8bd8944acd", + "profile": "candidate", + "note": "usb: typec: tipd: treat -ENOSPC as a taken display on every SoC (PR #186 commit 3/3). Overlaps unmerged PR #163, which fixes the same bug by changing the cd321x_display_taken() signature; the two conflict, so only this one is carried." + } + ], + "config": { + "candidate": { + "UDMABUF": "y", + "DMABUF_HEAPS": "y", + "DMABUF_HEAPS_SYSTEM": "y" + }, + "connectx": { + "NET_VENDOR_MELLANOX": "y", + "MLX5_CORE": "m", + "MLX5_CORE_EN": "y", + "MLXFW": "m" + } + }, + "host_tests": [ + "tools/asahi/pmp-bootargs-tests.rs", + "tools/asahi/pmp-power-tests.rs" + ], + "qualification": "Separate ConnectX Ethernet build candidate on wip5 source, no eGPU source changes. No native build, boot, adapter, network throughput, dock or recovery qualification.", + "superseded_patches": [ + { + "file": "0001-stock-bindgen-layout-policy.patch", + "sha256": "bba23efd3298c7f4fba31bde6a7a798b73fcbce7d07cb87683422d429615dedd", + "upstream": "https://github.com/omacom/linux-aurora/commit/4c56f9cd3033e5f65ef9c61bc7b396d50bce23f7", + "head": "4c56f9cd3033e5f65ef9c61bc7b396d50bce23f7", + "profile": "candidate", + "note": "Historical local port for wip1; corresponding stock-bindgen default and BINDGEN_LAYOUT_TESTS opt-in are now carried in merged upstream source. Retained for provenance; not applied to wip2." + } + ] +} diff --git a/mseries/aurora/unified72/egpu-ci-2026-10-30.json b/mseries/aurora/unified72/egpu-ci-2026-10-30.json new file mode 100644 index 00000000..451fd6d6 --- /dev/null +++ b/mseries/aurora/unified72/egpu-ci-2026-10-30.json @@ -0,0 +1,25 @@ +{ + "run": "https://github.com/techmore/ElementaryOS_MSeries/actions/runs/41048473839", + "run_head": "ad58f2d84af348f5d3b53e690dfcd27c550c4d98", + "artifact_id": 12975712845, + "archive_sha256": "6df3e978c044d1eab29ad6551364b0f991accfecaab50a781ff17aa0c63cbb35", + "sha256sums": "all four entries verified", + "profile": "unified72-egpu", + "source": "c506e1c3c1d7808eddc251e3029b72e9f17e00df", + "kernel_release": "7.2.11-elementary-aurora72-egpu-test", + "package": "linux-image-elementary-aurora72-egpu-test_7.2.11+elementary.aurora72.egpu.test-1_arm64.deb", + "package_sha256": "e15886c71ec6189eefbf82a9283674ebb17962db62fa68f2421aca0680923763", + "image_sha256": "d83db5e28c487058a4338df072fa55d58e43d34c190045d0d0c02aff00ac769a", + "j314s_dtb_sha256": "7f515974eb466d075e94d435c58543e3c30b1da3bd02d5f6dcf5d067e5747698", + "amdgpu_vermagic": "7.2.11-elementary-aurora72-egpu-test SMP preempt mod_unload aarch64", + "configuration": { + "ARM64_16K_PAGES": "y", + "DRM_AMDGPU": "m", + "DRM_AMD_DC": "y", + "DRM_AMD_DC_FP": "y", + "USB4_APPLE_SOC": "m" + }, + "no_boot_payload": true, + "hardware_boot": "not performed", + "cache": "~/.cache/mseries-aurora-egpu-20261030/ci-artifact" +} diff --git a/mseries/aurora/unified72/egpu-series.json b/mseries/aurora/unified72/egpu-series.json new file mode 100644 index 00000000..cb6d46f3 --- /dev/null +++ b/mseries/aurora/unified72/egpu-series.json @@ -0,0 +1,89 @@ +{ + "schema": 1, + "base_source": "c46d7dcdb8712ea9aeb0ce47b439ffae76371e55", + "revision": 1, + "source": { + "repository": "omacom/linux-aurora", + "commit": "c506e1c3c1d7808eddc251e3029b72e9f17e00df", + "git_url": "https://github.com/omacom/linux-aurora.git", + "git_tree_sha1": "0d623a83778ca41725417a7716e0399932bc5405", + "upstream_pr": "https://github.com/omacom/linux-aurora/pull/188", + "upstream_ref": "PR #188 merge; first parent is the wip5 source", + "name": "linux-aurora-c506e1c3c1d7808eddc251e3029b72e9f17e00df.tar.gz", + "url": "https://codeload.github.com/omacom/linux-aurora/tar.gz/c506e1c3c1d7808eddc251e3029b72e9f17e00df", + "archive_root": "linux-aurora-c506e1c3c1d7808eddc251e3029b72e9f17e00df", + "sha256": "13cfc68aa95ffd0ac858e1a57d95691a10499a4800f3a8ae6deefc7394f238e2" + }, + "kernel_release": { + "unified72-egpu": "7.2.11-elementary-aurora72-egpu-test" + }, + "debian_package": "linux-image-elementary-aurora72-egpu-test", + "debian_version": "7.2.11+elementary.aurora72.egpu.test-1", + "patches": [ + { + "file": "0001-drm-apple-srgb-external-display-colour.patch", + "sha256": "6dc8aadcdc0c7c39710d3b9164c388f11b0b2fa111b73e8e14a63bb759ba8fe1", + "upstream": "https://github.com/omacom/linux-aurora/pull/157", + "head": "9d3aeb24cb864d5f99a7172e9004884bf3c1a9a0", + "profile": "candidate", + "note": "drm/apple: sRGB surfaces and an sRGB link colorimetry for external displays (unmerged upstream PR #157, 5 files, +73/-6). Rebased for wip5 (context only; previous sha256 9cd617e413c69006349e8ffa914ee0c16d1d7ba246d5afd9e1031aafbbf09573): the dcp-internal.h hunk now sits above the new dcp-panel-edid.h include and the plane.c hunk moved +194 lines after upstream's plane-layout rewrite. Added and removed lines are unchanged. Must be re-checked if #157 moves." + }, + { + "file": "0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch", + "sha256": "fdd6f9cd13ca90b4500130d289182eb69728e25afe5a5ed3f0c92571aa54fd1a", + "upstream": null, + "head": null, + "profile": "candidate", + "note": "drm/apple: local, not upstream. A DCP whose DPTX RemotePort times out is passed over for 300 s, and a timed-out release no longer pins the port's DP tunnel route to it. Applies after 0001 to the #158 source (checked against the exact files; full-tree apply is checked by candidate.py prepare and CI). Never built or booted." + }, + { + "file": "0003-drm-apple-dcp-let-a-typec-port-with-hpd-take-over-a-held-pipeline.patch", + "sha256": "2273d0ee008bafc702358bfc553ecfdd8cd9ea8d665c4ce5fb2b3b36af4f9111", + "upstream": "https://github.com/omacom/linux-aurora/pull/186", + "head": "4da4932b130b21d7367d56859f558c4e8a8f101f", + "profile": "candidate", + "note": "drm/apple: dcp: let a Type-C port with HPD take over a pipeline held without it (omacom/linux-aurora PR #186 commit 1/3, author-reported on an M1 Pro J314s). Unmerged upstream; not reviewed upstream." + }, + { + "file": "0004-drm-apple-dcp-route-a-dp-alt-port-only-once-its-sink-asserts-hpd.patch", + "sha256": "111a8d0d4edca05367301e8e1afc3a487bf1638b015073ea81ae64cd1d4817ec", + "upstream": "https://github.com/omacom/linux-aurora/pull/186", + "head": "bd1ad7b9b2795b7d3b3c7e616a54b78f9c92c6e0", + "profile": "candidate", + "note": "drm/apple: dcp: route a DP-alt port only once its sink asserts HPD (PR #186 commit 2/3). Its message reports that routing before HPD left the DPTX service on that DCP answering -110 until reboot, the symptom seen on dcpext1 (28cc00000) here." + }, + { + "file": "0005-usb-typec-tipd-treat-enospc-as-a-taken-display-on-every-soc.patch", + "sha256": "f6c63701d3197204abd1f3c3bd9fb9c44a0a7156afdd63cba2feb04c5522c037", + "upstream": "https://github.com/omacom/linux-aurora/pull/186", + "head": "2a37f6f206456462970b3bbb3bf9bf8bd8944acd", + "profile": "candidate", + "note": "usb: typec: tipd: treat -ENOSPC as a taken display on every SoC (PR #186 commit 3/3). Overlaps unmerged PR #163, which fixes the same bug by changing the cd321x_display_taken() signature; the two conflict, so only this one is carried." + } + ], + "config": { + "candidate": { + "UDMABUF": "y", + "DMABUF_HEAPS": "y", + "DMABUF_HEAPS_SYSTEM": "y" + }, + "egpu": { + "DRM_AMDGPU": "m" + } + }, + "host_tests": [ + "tools/asahi/pmp-bootargs-tests.rs", + "tools/asahi/pmp-power-tests.rs" + ], + "qualification": "Experimental build-only eGPU candidate. PR #188 merge over wip5 source; existing five display patches preserved. AMDGPU enabled as a module. No kernel build, boot, shared-DTB fallback, dock, or eGPU hardware qualification.", + "superseded_patches": [ + { + "file": "0001-stock-bindgen-layout-policy.patch", + "sha256": "bba23efd3298c7f4fba31bde6a7a798b73fcbce7d07cb87683422d429615dedd", + "upstream": "https://github.com/omacom/linux-aurora/commit/4c56f9cd3033e5f65ef9c61bc7b396d50bce23f7", + "head": "4c56f9cd3033e5f65ef9c61bc7b396d50bce23f7", + "profile": "candidate", + "note": "Historical local port for wip1; corresponding stock-bindgen default and BINDGEN_LAYOUT_TESTS opt-in are now carried in merged upstream source. Retained for provenance; not applied to wip2." + } + ] +} diff --git a/mseries/aurora/unified72/prepare-egpu-boot-candidate.py b/mseries/aurora/unified72/prepare-egpu-boot-candidate.py new file mode 100644 index 00000000..bbff7d01 --- /dev/null +++ b/mseries/aurora/unified72/prepare-egpu-boot-candidate.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +"""Create an uninstalled J314S boot candidate with only #188's PCI range changes. + +This does not establish fallback compatibility, replace /boot, or arm a boot. +""" +import argparse +import hashlib +import importlib.util +import json +from pathlib import Path +import struct + +HERE = Path(__file__).resolve().parent +spec = importlib.util.spec_from_file_location('swap_dtb', HERE.parents[1] / 'fairydust/usb4/swap-dtb.py') +swap = importlib.util.module_from_spec(spec) +spec.loader.exec_module(swap) + + +def digest(data): + return hashlib.sha256(data).hexdigest() + + +def compose(original): + start, trees, end = swap.split(original) + matches = [(off, size) for off, size in trees if b'apple,j314s\0' in original[off:off + size]] + if len(matches) != 1: + raise ValueError('expected exactly one J314S DTB') + offset, size = matches[0] + old = original[offset:offset + size] + new = old + for high in (12, 16, 20): + before = struct.pack('>7I', 0x43000000, 8, 0, high, 0, 2, 0) + after = struct.pack('>7I', 0x43000000, high, 0, high, 0, 2, 0) + if new.count(before) != 1 or new.count(after): + raise ValueError(f'unexpected or ambiguous tunnel range {high:#x}') + new = new.replace(before, after) + if len(new) != len(old) or sum(a != b for a, b in zip(old, new)) != 3: + raise ValueError('unexpected change to device tree') + candidate = original[:offset] + new + original[offset + size:] + new_start, new_trees, new_end = swap.split(candidate) + if (new_start, new_trees, new_end) != (start, trees, end): + raise ValueError('candidate boot structure differs') + if candidate[:offset] != original[:offset] or candidate[offset + size:] != original[offset + size:]: + raise ValueError('candidate changed data outside target DTB') + return candidate, {'input_sha256': digest(original), 'candidate_sha256': digest(candidate), + 'old_dtb_sha256': digest(old), 'candidate_dtb_sha256': digest(new), + 'dtb_count': len(trees), 'changed_dtb_bytes': 3, + 'status': 'uninstalled, unbooted; shared fallback compatibility unverified'} + + +def main(): + p = argparse.ArgumentParser(description=__doc__) + p.add_argument('--input', required=True, type=Path) + p.add_argument('--expected-sha256', required=True) + p.add_argument('--output', required=True, type=Path, help='new file outside /boot') + a = p.parse_args() + dest = a.output.resolve() + if dest == Path('/boot') or Path('/boot') in dest.parents: + p.error('output must be outside /boot') + original = a.input.read_bytes() + if digest(original) != a.expected_sha256: + p.error('input checksum differs from expected') + candidate, receipt = compose(original) + with dest.open('xb') as f: + f.write(candidate) + print(json.dumps(receipt, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/mseries/local-ai/README.md b/mseries/local-ai/README.md index b8f06d9b..8a35e6c3 100644 --- a/mseries/local-ai/README.md +++ b/mseries/local-ai/README.md @@ -1,6 +1,6 @@ # Local assistants on the M1 Pro -The October 16 setup uses private Linux MLX v0.7.33, Newelle for desktop and personal assistance, and a separate 16K coding profile for Crush. Qwen3.5 4B is the measured default for the 32 GB M1 Pro; Qwen9 is an optional larger preset. [Measured results, methods and limits](receipts/2026-10-16.md) explain the provisional model choices. [Exact revisions and licenses](receipts/2026-10-16/source-pins.json) accompany the synthetic raw results. +The installed desktop uses private Linux MLX v0.7.35, Newelle for desktop and personal assistance, and a separate 16K coding profile for Crush. Qwen3.5 4B is the measured default for the 32 GB M1 Pro; Qwen9 is an optional larger preset. [Measured results, methods and limits](receipts/2026-10-16.md) explain the provisional model choices. [Exact revisions and licenses](receipts/2026-10-16/source-pins.json) accompany the synthetic raw results. ## Install and launch diff --git a/mseries/local-ai/WARREN-UPSTREAM-2026-10-30.md b/mseries/local-ai/WARREN-UPSTREAM-2026-10-30.md new file mode 100644 index 00000000..98cb6609 --- /dev/null +++ b/mseries/local-ai/WARREN-UPSTREAM-2026-10-30.md @@ -0,0 +1,16 @@ +# Warren upstream updates: M1 Pro applicability — 2026-10-30 + +**Deployment follow-up:** official MLX v0.7.35 is installed with regression checks and a retained rollback environment; the eGPU kernel payload and AMD firmware are installed and a non-default trial boot entry is staged. The running kernel and shared boot DTB are unchanged. The investigation below records the state at the time of the original audit. See [MLX deployment](receipts/2026-10-30-mlx-v0735-deploy/README.md) and [kernel staging](../aurora/unified72/README.md#separate-egpu-candidate--october-30-2026). + +Source: [announcement](https://joshuawarren.com/blog/what-i-open-sourced-today-egpus-connectx-tensorfold/). This is an assessment, not an installation or hardware qualification. + +The running host reported `7.2.11-elementary-aurora72-wip5`; `origin/dev` at `2c91b38d` pins its source to `2f725546`. A PCI inventory showed the Thunderbolt dock but no external GPU or ConnectX card. The running config says `CONFIG_DRM_AMDGPU` is unset. There was no `CONFIG_MLX5_CORE` line in `/proc/config.gz`; this alone does not establish whether all prerequisite options are enabled. + +* [TensorFold #1526](https://github.com/ashhart/TensorFold/pull/1526) provides an opt-in Vulkan runtime and one Q4 projection, not a model-serving backend. The 2B engine is [#1544](https://github.com/ashhart/TensorFold/pull/1544), and the announced fast batching is a separate follow-up. Our [scoreboard](ENGINE-SCOREBOARD.md) already records an older experimental 2B build, including long-output divergence. Do not replace the existing server or claim the M1 Max result on the M1 Pro. Re-evaluate a pinned public engine and batching revision with matched-model fidelity and desktop responsiveness gates. +* [omarchy-mlx #303](https://github.com/joshuaswarren/omarchy-mlx/pull/303), merged as `42b30a2`, optimizes 2–4 row batched decode. Its M2 Max batch-2 result regressed, and M1 Pro is unmeasured. The project installer pins v0.7.34 and source `5e40ecf953e8b907dcae1ce6caadce6ad62b0e0f`; the upstream author says this change ships in the next release. Build a separate pinned candidate and compare batch sizes, token fidelity, memory and responsiveness before changing the installed runtime. +* [Aurora #188](https://github.com/omacom/linux-aurora/pull/188) merged after the wip5 source pin. It includes AMD non-posted BAR handling, Apple PCI tunnel scanning and T600x/T602x device-tree range changes. Hardware evidence is primarily M2 Max; the rebased PR and shared changes must be reviewed against wip5 and J314S dock/recovery behavior. Device-tree changes require a matching boot chain; a modules-only update cannot supply them. Do not silently replace the shared boot payload or default kernel. No local eGPU is present for qualification. +* [ConnectX-5 setup](https://github.com/joshuaswarren/omarchy-egpu/blob/main/cards/connectx-5/README.md) requires suitable hardware and `mlx5_core`; the author reports no special PCI or device-tree patch for the tested M2 Max. The RTX recipe likewise needs an external NVIDIA GPU. Neither hardware was visible in this inventory. + +Next: pin and review a new Aurora source candidate including #188, compare its DTBs with the installed recovery path, build without boot hooks, and qualify dock, recovery and any actual eGPU on attended hardware before promotion. In parallel, qualify a released or exact-source MLX candidate against the current installed version. Preserve the existing worker and boot defaults until those gates pass. + +Follow-up: a distinct [Aurora eGPU profile](../aurora/unified72/README.md#separate-egpu-candidate--october-30-2026) now pins the #188 merge and enables AMDGPU as a module; its native build was submitted to [CI run 41048473839](https://github.com/techmore/ElementaryOS_MSeries/actions/runs/41048473839). An isolated MLX #303 candidate passed the Qwen single-stream gate and three short batch pairs; the batch-3 result was mixed; both batch-4 routes are traced. [Measurements](receipts/2026-10-30-qmv-batch/README.md). diff --git a/mseries/local-ai/install-coreglass.sh b/mseries/local-ai/install-coreglass.sh index c2bfe088..6f8fa59d 100755 --- a/mseries/local-ai/install-coreglass.sh +++ b/mseries/local-ai/install-coreglass.sh @@ -4,7 +4,7 @@ set -euo pipefail here=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd) read -r pin < <(python3 -c 'import json,sys; print(json.load(open(sys.argv[1]))["upstreams"]["coreglass"]["pin"])' "$here/upstreams.json") -src=${MSERIES_AI_SOURCES:-$HOME/.local/share/mseries-ai/sources/v0.7.34}/coreglass +src=${MSERIES_AI_SOURCES:-$HOME/.local/share/mseries-ai/sources/v0.7.35}/coreglass if [[ ! -d $src/.git ]]; then git init -q "$src" git -C "$src" remote add origin https://github.com/joshuaswarren/coreglass.git diff --git a/mseries/local-ai/install.sh b/mseries/local-ai/install.sh index a0c7661c..00aa7948 100755 --- a/mseries/local-ai/install.sh +++ b/mseries/local-ai/install.sh @@ -5,7 +5,7 @@ set -euo pipefail grep -aq 'apple,' /proc/device-tree/compatible || { echo 'Requires Apple Silicon' >&2; exit 1; } python3 -c 'import sys; assert sys.version_info[:2] == (3,14), "Python 3.14 required"' script_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd) -work=${MSERIES_AI_SOURCES:-$HOME/.local/share/mseries-ai/sources/v0.7.34} +work=${MSERIES_AI_SOURCES:-$HOME/.local/share/mseries-ai/sources/v0.7.35} prefix=$HOME/.local/share/mlx-omarchy mkdir -p "$work" # The upstream installer clears its venv. Never replace a running worker. @@ -14,7 +14,7 @@ if pgrep -u "$(id -u)" -f "$prefix/venv/bin/python" >/dev/null; then fi backup= if [[ -e $prefix ]]; then - backup=${prefix}.before-v0.7.34-$(date +%s) + backup=${prefix}.before-v0.7.35-$(date +%s) mv "$prefix" "$backup" fi installer= @@ -54,7 +54,7 @@ checkout() { } } checkout coreglass coreglass 53dd379e74df875ad7dee8a9ef8ddc4156508604 -checkout omarchy-mlx omarchy-mlx 5e40ecf953e8b907dcae1ce6caadce6ad62b0e0f +checkout omarchy-mlx omarchy-mlx 42b30a2de2f8b42e673cc50eaca9f7b145f04ac6 # 9323171c12 (2026-10-25): identical MLX gate results to 7faf04c065 and faster decode on the # M1 Pro (Qwen 2B +36%, Qwen 4B +24%, LFM3 +48% at defaults); see ENGINE-SCOREBOARD.md. checkout mesa-mlx-compute mesa-1 9323171c12c5aa6055f1031ea26c16c247191987 @@ -102,7 +102,7 @@ text=text.replace(old,'ROOT="'+str(root)+'"',1) Path(sys.argv[2]).write_text(text) PY export OMARCHY_MLX_SYSTEM_PREFIX=$prefix -MLX_OMARCHY_VERSION=v0.7.34 bash "$installer" +MLX_OMARCHY_VERSION=v0.7.35 bash "$installer" python3 "$script_dir/configure-prefill.py" "$prefix/mlx_omarchy_serve/__main__.py" python3 "$script_dir/configure-serve-concurrency.py" "$prefix/mlx_omarchy_serve/__main__.py" # Our two private mlx-lm server patches, in a side copy that model-worker.py puts first on diff --git a/mseries/local-ai/receipts/2026-10-30-mlx-v0735-deploy/README.md b/mseries/local-ai/receipts/2026-10-30-mlx-v0735-deploy/README.md new file mode 100644 index 00000000..67fcb2b5 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-mlx-v0735-deploy/README.md @@ -0,0 +1,9 @@ +# MLX v0.7.35 deployment — 2026-10-30 + +Installed the official [v0.7.35](https://github.com/joshuaswarren/omarchy-mlx/releases/tag/v0.7.35) ARM64 Python 3.14 wheel, SHA-256 `39671c8a1e34c52cb2d575514e3b6bb00b2d1d8bbd2b21ae2f5dfad9c19fba82`, verified against the release `SHA256SUMS`. The wheel was installed into a copy of the existing virtual environment, then swapped into `~/.local/share/mlx-omarchy/venv` with the project worker lock held. The previous environment is retained at `~/.local/share/mlx-omarchy/venv.before-v0.7.35-20261030`; private Honeykrisp Mesa remains `9323171c12`. + +Regression checks before cutover: Qwen 2B `mlx-gate.py sweep --configs work120k` passed baseline and work120k ([gate](gate.json)). Three short Granite 1B in-process 120k runs returned the same text hash as the October 29 baseline; median decode 51.92 versus 52.17 tokens/s in the earlier run ([new](granite.json), [earlier](../2026-10-29-engine-compare-granite1b-short-hk9323171c12-mlx-5k+mlx-120k+rapid-120k+serve-120k+serve-patched-120k.json)). The previously recorded source-built v0.7.35 batch comparison is [here](../2026-10-30-qmv-batch/README.md); batch 3 was mixed. The two Granite measurements are from separate sessions and do not establish a statistically significant speed change. + +Stopped only `mseries-reply-model.service` for the swap and restarted it afterward. Live package metadata reports `0.32.4.dev202610292155+42b30a2d`; the running process maps the new `libmlx.so` (SHA-256 `2f9605565068e42d1c18d4c8d293c461fdc8dc742c2f91deeed0f08f2a02968a`); `mlx-omarchy-info` reports the expected private ICD; the local health endpoint reports the model loaded; a loopback chat request returned `ready`. `serve-patch.sh check` reports the three existing server patches intact. The project installer and upstream manifest now pin v0.7.35; seven upstream pin tests and shell syntax checks pass. Factory image rebuild and extended workload regression remain separate. + +To roll back, stop the reply service and any other MLX workers, acquire the shared worker lock, move the current `venv` aside, rename the saved `venv.before-v0.7.35-20261030` back to `venv`, and restart the service. Do not replace an active worker's environment. diff --git a/mseries/local-ai/receipts/2026-10-30-mlx-v0735-deploy/gate.json b/mseries/local-ai/receipts/2026-10-30-mlx-v0735-deploy/gate.json new file mode 100644 index 00000000..71fe10c8 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-mlx-v0735-deploy/gate.json @@ -0,0 +1,552 @@ +{ + "model": "mlx-community/Qwen3.5-2B-MLX-4bit@93760be4", + "weights_sha256": "713fe7e5d3c3965f7106b0d0ee17615f7869c23c8d327996df8c1196fbcf07d5", + "kernel": "7.2.11-elementary-aurora72-wip5", + "driver": "Honeykrisp Mesa 9323171c12", + "steps": 32, + "tie_margin": 0.5, + "margins": { + "pooled": 1.05, + "case": 1.15 + }, + "cases": [ + "rainbow", + "single", + "unicode", + "code", + "prose", + "math" + ], + "configs": { + "baseline": { + "env": {}, + "exit": 0, + "stopped": null, + "seconds": 13.2, + "min_available_gib": 18.04, + "peak_temp_c": 42.315, + "cases": { + "rainbow": { + "rmse": 0.031829616408239544, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 29108, + 4009, + 33060, + 1472, + 279, + 16078, + 321, + 5055, + 18766, + 21479, + 318, + 65, + 305, + 8, + 430, + 424, + 27891, + 264, + 10849, + 6508, + 13, + 198, + 760, + 3000, + 1179, + 25133, + 974, + 279, + 1142, + 314, + 279, + 6756 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 38.89261933230246 + }, + "single": { + "rmse": 0.04655662537948323, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 9419, + 0, + 2500, + 628, + 353, + 1438, + 488, + 30, + 248046, + 198, + 248044, + 248045, + 846, + 198, + 12675, + 248046, + 198, + 248045, + 74455, + 198, + 248068, + 271, + 248069, + 271, + 9419, + 0, + 2500, + 628, + 353, + 1438, + 488, + 30 + ], + "first_divergence_vs_reference": 24, + "decode_tok_s": 38.90431733019817 + }, + "unicode": { + "rmse": 0.04732244977098923, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 22961, + 1900, + 25213, + 1725, + 191718, + 72163, + 84146, + 11, + 307, + 16811, + 51424, + 6167, + 907, + 7925, + 10838, + 234, + 99, + 29545, + 248046, + 198, + 248044, + 248045, + 74455, + 271, + 248068, + 198, + 31248, + 11, + 353, + 1144, + 310, + 14260 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 38.86602202301842 + }, + "code": { + "rmse": 0.029475553767825832, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 71093, + 12305, + 198, + 12237, + 198, + 8275, + 1340, + 76938, + 27435, + 271, + 1919, + 4536, + 5529, + 264, + 709, + 310, + 10724, + 279, + 307, + 7324, + 76938, + 1324, + 198, + 940, + 449, + 83876, + 5313, + 11, + 864, + 369, + 777, + 4779 + ], + "first_divergence_vs_reference": 16, + "decode_tok_s": 37.85018522822679 + }, + "prose": { + "rmse": 0.028039759816311564, + "argmax_agree": 0.96875, + "non_tie_flips": [], + "ids": [ + 760, + 12433, + 2197, + 383, + 7348, + 310, + 3286, + 279, + 7786, + 364, + 279, + 491, + 6522, + 19403, + 11, + 694, + 1238, + 264, + 33073, + 9915, + 383, + 6829, + 11, + 61892, + 11, + 321, + 279, + 7832, + 24024, + 11, + 781, + 6426 + ], + "first_divergence_vs_reference": 20, + "decode_tok_s": 35.88103426413356 + }, + "math": { + "rmse": 0.03005468944964068, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 1206, + 1423, + 279, + 18085, + 854, + 11, + 567, + 1144, + 310, + 10724, + 279, + 2702, + 854, + 4284, + 310, + 5640, + 279, + 5821, + 321, + 1179, + 884, + 421, + 7836, + 310, + 279, + 24125, + 854, + 13, + 271, + 13962, + 14392, + 220 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 40.39005236424658 + } + }, + "violations": [], + "pooled_rmse": 0.03646546050291926, + "median_decode_tok_s": 38.89261933230246, + "pass": true, + "gate": "PASS" + }, + "work120k": { + "env": { + "MLX_OMARCHY_BATCH_WORK": "120000" + }, + "exit": 0, + "stopped": null, + "seconds": 14.1, + "min_available_gib": 17.33, + "peak_temp_c": 43.021, + "cases": { + "rainbow": { + "rmse": 0.031829616408239544, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 29108, + 4009, + 33060, + 1472, + 279, + 16078, + 321, + 5055, + 18766, + 21479, + 318, + 65, + 305, + 8, + 430, + 424, + 27891, + 264, + 10849, + 6508, + 13, + 198, + 760, + 3000, + 1179, + 25133, + 974, + 279, + 1142, + 314, + 279, + 6756 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 27.452335676301956, + "first_divergence_vs_baseline": null + }, + "single": { + "rmse": 0.04655662537948323, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 9419, + 0, + 2500, + 628, + 353, + 1438, + 488, + 30, + 248046, + 198, + 248044, + 248045, + 846, + 198, + 12675, + 248046, + 198, + 248045, + 74455, + 198, + 248068, + 271, + 248069, + 271, + 9419, + 0, + 2500, + 628, + 353, + 1438, + 488, + 30 + ], + "first_divergence_vs_reference": 24, + "decode_tok_s": 29.55537249423445, + "first_divergence_vs_baseline": null + }, + "unicode": { + "rmse": 0.04732244977098923, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 22961, + 1900, + 25213, + 1725, + 191718, + 72163, + 84146, + 11, + 307, + 16811, + 51424, + 6167, + 907, + 7925, + 10838, + 234, + 99, + 29545, + 248046, + 198, + 248044, + 248045, + 74455, + 271, + 248068, + 198, + 31248, + 11, + 353, + 1144, + 310, + 14260 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 28.174567712941133, + "first_divergence_vs_baseline": null + }, + "code": { + "rmse": 0.029475553767825832, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 71093, + 12305, + 198, + 12237, + 198, + 8275, + 1340, + 76938, + 27435, + 271, + 1919, + 4536, + 5529, + 264, + 709, + 310, + 10724, + 279, + 307, + 7324, + 76938, + 1324, + 198, + 940, + 449, + 83876, + 5313, + 11, + 864, + 369, + 777, + 4779 + ], + "first_divergence_vs_reference": 16, + "decode_tok_s": 27.755215299643037, + "first_divergence_vs_baseline": null + }, + "prose": { + "rmse": 0.028039759816311564, + "argmax_agree": 0.96875, + "non_tie_flips": [], + "ids": [ + 760, + 12433, + 2197, + 383, + 7348, + 310, + 3286, + 279, + 7786, + 364, + 279, + 491, + 6522, + 19403, + 11, + 694, + 1238, + 264, + 33073, + 9915, + 383, + 6829, + 11, + 61892, + 11, + 321, + 279, + 7832, + 24024, + 11, + 781, + 6426 + ], + "first_divergence_vs_reference": 20, + "decode_tok_s": 27.84307557815656, + "first_divergence_vs_baseline": null + }, + "math": { + "rmse": 0.03005468944964068, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 1206, + 1423, + 279, + 18085, + 854, + 11, + 567, + 1144, + 310, + 10724, + 279, + 2702, + 854, + 4284, + 310, + 5640, + 279, + 5821, + 321, + 1179, + 884, + 421, + 7836, + 310, + 279, + 24125, + 854, + 13, + 271, + 13962, + 14392, + 220 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 28.410353961779304, + "first_divergence_vs_baseline": null + } + }, + "violations": [], + "pooled_rmse": 0.03646546050291926, + "median_decode_tok_s": 28.174567712941133, + "pass": true, + "gate": "PASS" + } + } +} diff --git a/mseries/local-ai/receipts/2026-10-30-mlx-v0735-deploy/granite.json b/mseries/local-ai/receipts/2026-10-30-mlx-v0735-deploy/granite.json new file mode 100644 index 00000000..5f3c7702 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-mlx-v0735-deploy/granite.json @@ -0,0 +1,162 @@ +{ + "status": "complete", + "model_key": "granite1b", + "model": "mlx-community/granite-4.0-1b-4bit@29f108a4e2ff99079a173004871604c2f1e12c1f", + "weights_sha256": "b7a43ebbc86517b8ecfc4cff265a787ea31620f7eb356984c08abe14646617c7", + "kernel": "7.2.11-elementary-aurora72-wip5", + "driver": "Honeykrisp Mesa 9323171c12", + "tensorfold_rev": "92bb49db5c313c105cbf4b44638d1e1896615174", + "rapid_rev": "1d09cdb684bbf58fac130f5804b08ee2e1f56558", + "serve_concurrency": 4, + "prompt_sha256": "af125b15dfba55caedb541e89e59fe1252c0f13553e5ce6bc181e237fada9926", + "max_tokens": 32, + "policy": { + "reserve_gib": 6, + "max_fan_rpm": null, + "max_temp_c": 80 + }, + "allowance_gib": 3.5, + "arms": [ + "mlx-120k" + ], + "concurrency": 1, + "runs": [ + { + "arm": "mlx-120k", + "stopped": null, + "samples": [ + { + "t": 0.01, + "available_gib": 19.682, + "max_temp_c": 42.896, + "max_fan_rpm": 2495.0 + }, + { + "t": 1.01, + "available_gib": 18.745, + "max_temp_c": 42.684, + "max_fan_rpm": 2516.0 + }, + { + "t": 2.02, + "available_gib": 18.39, + "max_temp_c": 42.586, + "max_fan_rpm": 2507.0 + }, + { + "t": 3.03, + "available_gib": 18.227, + "max_temp_c": 42.298, + "max_fan_rpm": 2512.0 + } + ], + "log_tail": "", + "ready_s": 2.41375232900009, + "ttft_s": 0.2828933760001746, + "total_s": 0.878569059000256, + "completion_tokens": 32, + "text": "A rainbow forms when sunlight enters a water droplet in the air, causing it to refract and reflect inside the droplet. As the light refracts,", + "text_sha256": "81588d18f3846cfeedeae583a5c7771c04a5568c3bec5aece292542a8adc7741", + "decode_tps": 52.04174164684807, + "min_available_gib": 18.227, + "peak_temp_c": 42.896, + "round": 1, + "admission_available_gib": 19.682 + }, + { + "arm": "mlx-120k", + "stopped": null, + "samples": [ + { + "t": 0.02, + "available_gib": 19.44, + "max_temp_c": 43.195, + "max_fan_rpm": 2516.0 + }, + { + "t": 1.03, + "available_gib": 18.567, + "max_temp_c": 43.152, + "max_fan_rpm": 2507.0 + }, + { + "t": 2.04, + "available_gib": 18.264, + "max_temp_c": 43.701, + "max_fan_rpm": 2511.0 + }, + { + "t": 3.06, + "available_gib": 18.16, + "max_temp_c": 42.635, + "max_fan_rpm": 2494.0 + } + ], + "log_tail": "", + "ready_s": 2.29382806600006, + "ttft_s": 0.30168930099989666, + "total_s": 0.8987894849997247, + "completion_tokens": 32, + "text": "A rainbow forms when sunlight enters a water droplet in the air, causing it to refract and reflect inside the droplet. As the light refracts,", + "text_sha256": "81588d18f3846cfeedeae583a5c7771c04a5568c3bec5aece292542a8adc7741", + "decode_tps": 51.917585743046644, + "min_available_gib": 18.16, + "peak_temp_c": 43.701, + "round": 2, + "admission_available_gib": 19.44 + }, + { + "arm": "mlx-120k", + "stopped": null, + "samples": [ + { + "t": 0.02, + "available_gib": 19.714, + "max_temp_c": 43.902, + "max_fan_rpm": 2508.0 + }, + { + "t": 1.03, + "available_gib": 18.763, + "max_temp_c": 42.983, + "max_fan_rpm": 2495.0 + }, + { + "t": 2.04, + "available_gib": 18.207, + "max_temp_c": 43.239, + "max_fan_rpm": 2486.0 + }, + { + "t": 3.06, + "available_gib": 18.101, + "max_temp_c": 43.152, + "max_fan_rpm": 2494.0 + } + ], + "log_tail": "", + "ready_s": 2.2656063040003573, + "ttft_s": 0.29355542300072557, + "total_s": 0.8926546490001783, + "completion_tokens": 32, + "text": "A rainbow forms when sunlight enters a water droplet in the air, causing it to refract and reflect inside the droplet. As the light refracts,", + "text_sha256": "81588d18f3846cfeedeae583a5c7771c04a5568c3bec5aece292542a8adc7741", + "decode_tps": 51.744349941838045, + "min_available_gib": 18.101, + "peak_temp_c": 43.902, + "round": 3, + "admission_available_gib": 19.714 + } + ], + "summary": { + "mlx-120k": { + "ok_runs": 3, + "median_ttft_s": 0.29355542300072557, + "median_total_s": 0.8926546490001783, + "median_decode_tps": 51.917585743046644, + "texts": [ + "81588d18f384" + ] + } + } +} diff --git a/mseries/local-ai/receipts/2026-10-30-qmv-batch/README.md b/mseries/local-ai/receipts/2026-10-30-qmv-batch/README.md new file mode 100644 index 00000000..0ea34924 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-qmv-batch/README.md @@ -0,0 +1,17 @@ +# QMV batch candidate on the J314S — 2026-10-30 + +Built upstream omarchy-mlx merge `42b30a2de2f8b42e673cc50eaca9f7b145f04ac6` in a private checkout using `scripts/build-wheel.sh`, three build jobs and the existing pinned whole-encoder bundle. Wheel SHA-256 `b4a0094507d82b400c7bbfd1f9270a739f8eef2ba1d61f3dd649cd3ac3cc7c97`; installed only into a copy of the live virtual environment. The baseline is the installed v0.7.34 source `5e40ecf953e8b907dcae1ce6caadce6ad62b0e0f`; the candidate contains other intervening source changes as well as #303. Both use private Honeykrisp Mesa `9323171c12`, kernel `7.2.11-elementary-aurora72-wip5`, and the same locally cached Qwen3.5-2B MLX 4-bit model. + +The existing `mlx-gate.py sweep --configs work120k` passed its baseline and work120k configurations for both runtimes. The reference and margins are those of the project's Qwen 2B gate; raw reports are alongside this file. This checks single-stream correctness, not the batching optimization. + +For a batch smoke, ran upstream's `receipts/2026-10-29-qmv-batch-hoist/bg_decode_ab.py` with batch sizes 2, 3 and 4, 32 greedy tokens, one warmup and one measured generation in each fresh process. Three alternating baseline/candidate pairs were run at each size, in the order in the two JSON receipts. The harness held the project worker lock, required 4.5 GiB model allowance plus 6 GiB free reserve before each process, monitored the reserve and 80°C limit during each, and stopped on failure. All 18 processes completed; the generated token-ID hashes matched across runtimes for each batch size. + +| Batch | Live median ms/step | Candidate median ms/step | Median paired reduction | +|---|---:|---:|---:| +| 2 | 34.586 | 32.392 | 8.7% | +| 3 | 44.741 | 46.106 | -3.1% (slower) | +| 4 | 51.423 | 47.327 | 8.0% | + +The candidate's separately traced batch-4 model run contained 3,366 dispatches of kernel ID 547, including warmup and measurement. A real-device [probe](dispatch-probe.py) toggled `MLX_OMARCHY_QMV_BATCH` on the same wheel: its single quantized matmul dispatch changed from ID 410 to ID 547, consistent with the source's batch-kernel selection. The [probe log](dispatch-probe.log) preserves the markers and dispatches. Full model trace remains locally at `~/.cache/mseries-mlx-qmv-20261030/trace-4-candidate.log`, SHA-256 `4d4ffff02e8702d472c3806bb56ab4e05030fed51a9b24f5d1f6f73fad1b5b43`. The installed baseline was also probed: the same toggle selected ID 410 versus 547, and its separately traced batch-4 model run also contained 3,366 ID 547 dispatches. The baseline probe log is retained beside this file; its full model trace is local at `~/.cache/mseries-mlx-qmv-20261030/trace-4-live.log`, SHA-256 `985c9f5d7199bafd49f768e29d266cb7fb53e765296b940b09205ada16291b08`. Both runtimes use the batch route in these traces; the timings also include other source changes. + +This is a short loaded-desktop smoke, not a stable serving or numerical-fidelity qualification. Only one short prompt set and one model were tested; step timings exclude prefill, and matching hashes do not prove logits match. No installed runtime, desktop driver, or default changed. The mixed batch-3 result and unqualified serving fidelity argue against promotion now. diff --git a/mseries/local-ai/receipts/2026-10-30-qmv-batch/batch-repeat-results.json b/mseries/local-ai/receipts/2026-10-30-qmv-batch/batch-repeat-results.json new file mode 100644 index 00000000..3165f300 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-qmv-batch/batch-repeat-results.json @@ -0,0 +1,86 @@ +[ + { + "batch": 2, + "runtime": "candidate", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610301127+42b30a2 {'libmlx.so': 'b0f0789296453699'} device Device(gpu, 0)\nBGDECODE {\"B\": 2, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [32.694], \"median_ms_per_step\": 32.694, \"ids_sha\": \"b14f160c590bfe63\", \"row_lengths\": [32, 32]}\n" + }, + { + "batch": 2, + "runtime": "live", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610281952+5e40ecf9 {'libmlx.so': '7ca9b27ebb32c378'} device Device(gpu, 0)\nBGDECODE {\"B\": 2, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [32.09], \"median_ms_per_step\": 32.09, \"ids_sha\": \"b14f160c590bfe63\", \"row_lengths\": [32, 32]}\n" + }, + { + "batch": 3, + "runtime": "live", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610281952+5e40ecf9 {'libmlx.so': '7ca9b27ebb32c378'} device Device(gpu, 0)\nBGDECODE {\"B\": 3, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [44.741], \"median_ms_per_step\": 44.741, \"ids_sha\": \"343a8fc27c7a8e69\", \"row_lengths\": [32, 32, 32]}\n" + }, + { + "batch": 3, + "runtime": "candidate", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610301127+42b30a2 {'libmlx.so': 'b0f0789296453699'} device Device(gpu, 0)\nBGDECODE {\"B\": 3, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [46.106], \"median_ms_per_step\": 46.106, \"ids_sha\": \"343a8fc27c7a8e69\", \"row_lengths\": [32, 32, 32]}\n" + }, + { + "batch": 4, + "runtime": "candidate", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610301127+42b30a2 {'libmlx.so': 'b0f0789296453699'} device Device(gpu, 0)\nBGDECODE {\"B\": 4, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [47.327], \"median_ms_per_step\": 47.327, \"ids_sha\": \"6f10f649f8f8be05\", \"row_lengths\": [32, 32, 32, 32]}\n" + }, + { + "batch": 4, + "runtime": "live", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610281952+5e40ecf9 {'libmlx.so': '7ca9b27ebb32c378'} device Device(gpu, 0)\nBGDECODE {\"B\": 4, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [51.423], \"median_ms_per_step\": 51.423, \"ids_sha\": \"6f10f649f8f8be05\", \"row_lengths\": [32, 32, 32, 32]}\n" + }, + { + "batch": 2, + "runtime": "live", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610281952+5e40ecf9 {'libmlx.so': '7ca9b27ebb32c378'} device Device(gpu, 0)\nBGDECODE {\"B\": 2, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [34.586], \"median_ms_per_step\": 34.586, \"ids_sha\": \"b14f160c590bfe63\", \"row_lengths\": [32, 32]}\n" + }, + { + "batch": 2, + "runtime": "candidate", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610301127+42b30a2 {'libmlx.so': 'b0f0789296453699'} device Device(gpu, 0)\nBGDECODE {\"B\": 2, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [30.03], \"median_ms_per_step\": 30.03, \"ids_sha\": \"b14f160c590bfe63\", \"row_lengths\": [32, 32]}\n" + }, + { + "batch": 3, + "runtime": "candidate", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610301127+42b30a2 {'libmlx.so': 'b0f0789296453699'} device Device(gpu, 0)\nBGDECODE {\"B\": 3, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [47.934], \"median_ms_per_step\": 47.934, \"ids_sha\": \"343a8fc27c7a8e69\", \"row_lengths\": [32, 32, 32]}\n" + }, + { + "batch": 3, + "runtime": "live", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610281952+5e40ecf9 {'libmlx.so': '7ca9b27ebb32c378'} device Device(gpu, 0)\nBGDECODE {\"B\": 3, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [44.293], \"median_ms_per_step\": 44.293, \"ids_sha\": \"343a8fc27c7a8e69\", \"row_lengths\": [32, 32, 32]}\n" + }, + { + "batch": 4, + "runtime": "live", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610281952+5e40ecf9 {'libmlx.so': '7ca9b27ebb32c378'} device Device(gpu, 0)\nBGDECODE {\"B\": 4, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [50.905], \"median_ms_per_step\": 50.905, \"ids_sha\": \"6f10f649f8f8be05\", \"row_lengths\": [32, 32, 32, 32]}\n" + }, + { + "batch": 4, + "runtime": "candidate", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610301127+42b30a2 {'libmlx.so': 'b0f0789296453699'} device Device(gpu, 0)\nBGDECODE {\"B\": 4, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [45.384], \"median_ms_per_step\": 45.384, \"ids_sha\": \"6f10f649f8f8be05\", \"row_lengths\": [32, 32, 32, 32]}\n" + } +] diff --git a/mseries/local-ai/receipts/2026-10-30-qmv-batch/batch-results.json b/mseries/local-ai/receipts/2026-10-30-qmv-batch/batch-results.json new file mode 100644 index 00000000..05ff9da7 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-qmv-batch/batch-results.json @@ -0,0 +1,44 @@ +[ + { + "batch": 2, + "runtime": "live", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610281952+5e40ecf9 {'libmlx.so': '7ca9b27ebb32c378'} device Device(gpu, 0)\nBGDECODE {\"B\": 2, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [35.47], \"median_ms_per_step\": 35.47, \"ids_sha\": \"b14f160c590bfe63\", \"row_lengths\": [32, 32]}\n" + }, + { + "batch": 2, + "runtime": "candidate", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610301127+42b30a2 {'libmlx.so': 'b0f0789296453699'} device Device(gpu, 0)\nBGDECODE {\"B\": 2, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [32.392], \"median_ms_per_step\": 32.392, \"ids_sha\": \"b14f160c590bfe63\", \"row_lengths\": [32, 32]}\n" + }, + { + "batch": 3, + "runtime": "candidate", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610301127+42b30a2 {'libmlx.so': 'b0f0789296453699'} device Device(gpu, 0)\nBGDECODE {\"B\": 3, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [41.632], \"median_ms_per_step\": 41.632, \"ids_sha\": \"343a8fc27c7a8e69\", \"row_lengths\": [32, 32, 32]}\n" + }, + { + "batch": 3, + "runtime": "live", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610281952+5e40ecf9 {'libmlx.so': '7ca9b27ebb32c378'} device Device(gpu, 0)\nBGDECODE {\"B\": 3, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [46.063], \"median_ms_per_step\": 46.063, \"ids_sha\": \"343a8fc27c7a8e69\", \"row_lengths\": [32, 32, 32]}\n" + }, + { + "batch": 4, + "runtime": "live", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610281952+5e40ecf9 {'libmlx.so': '7ca9b27ebb32c378'} device Device(gpu, 0)\nBGDECODE {\"B\": 4, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [51.672], \"median_ms_per_step\": 51.672, \"ids_sha\": \"6f10f649f8f8be05\", \"row_lengths\": [32, 32, 32, 32]}\n" + }, + { + "batch": 4, + "runtime": "candidate", + "exit": 0, + "stop": [], + "output": "PROVENANCE mlx_omarchy 0.32.4.dev202610301127+42b30a2 {'libmlx.so': 'b0f0789296453699'} device Device(gpu, 0)\nBGDECODE {\"B\": 4, \"tokens\": 32, \"steps_timed\": 30, \"ms_per_step_reps\": [48.072], \"median_ms_per_step\": 48.072, \"ids_sha\": \"6f10f649f8f8be05\", \"row_lengths\": [32, 32, 32, 32]}\n" + } +] diff --git a/mseries/local-ai/receipts/2026-10-30-qmv-batch/dispatch-probe-live.log b/mseries/local-ai/receipts/2026-10-30-qmv-batch/dispatch-probe-live.log new file mode 100644 index 00000000..adc47022 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-qmv-batch/dispatch-probe-live.log @@ -0,0 +1,174 @@ +[rtmod] DISPATCH kernel=102 count=4 gx=1 gy=1 gz=1 +[rtmod] bind[0] off=0 range=8 alloc=4096 +[rtmod] bind[1] off=0 range=16 alloc=4096 +[rtmod] DISPATCH kernel=102 count=4 gx=1 gy=1 gz=1 +[rtmod] bind[0] off=0 range=8 alloc=4096 +[rtmod] bind[1] off=0 range=16 alloc=4096 +[rtmod] DISPATCH kernel=102 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16 alloc=4096 +[rtmod] bind[1] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58420 +[rtmod] SUBMIT tid=58420 cv=1 waits=0 sigs=1 cmds=1 +[rtmod] DISPATCH kernel=102 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16 alloc=4096 +[rtmod] bind[1] off=0 range=32768 alloc=32768 +[rtmod] DISPATCH kernel=14 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16777216 alloc=16777216 +[rtmod] bind[1] off=0 range=16777216 alloc=16777216 +[rtmod] bind[2] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58420 +[rtmod] SUBMIT tid=58420 cv=2 waits=1 sigs=1 cmds=1 +[rtmod] DISPATCH kernel=14 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=32768 alloc=32768 +[rtmod] bind[1] off=0 range=32768 alloc=32768 +[rtmod] bind[2] off=0 range=32768 alloc=32768 +[rtmod] FEW name=Divide count=4194304 +[rtmod] DISPATCH kernel=469 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16777216 alloc=16777216 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=16777216 alloc=16777216 +[rtmod] bind[3] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58420 +[rtmod] SUBMIT tid=58420 cv=3 waits=1 sigs=1 cmds=1 +[rtmod] FEW name=Subtract count=1 +[rtmod] DISPATCH kernel=469 count=1 gx=1 gy=1 gz=1 +[rtmod] bind[0] off=0 range=4 alloc=4096 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=4 alloc=4096 +[rtmod] bind[3] off=0 range=4 alloc=4096 +[rtmod] FEW name=Divide count=8192 +[rtmod] DISPATCH kernel=469 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=32768 alloc=32768 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=32768 alloc=32768 +[rtmod] bind[3] off=0 range=32768 alloc=32768 +[rtmod] FEW name=Subtract count=1 +[rtmod] DISPATCH kernel=469 count=1 gx=1 gy=1 gz=1 +[rtmod] bind[0] off=0 range=4 alloc=4096 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=4 alloc=4096 +[rtmod] bind[3] off=0 range=4 alloc=4096 +[rtmod] FEW name=Minimum count=4194304 +[rtmod] DISPATCH kernel=0 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16777216 alloc=16777216 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=16777216 alloc=16777216 +[rtmod] bind[3] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58420 +[rtmod] SUBMIT tid=58420 cv=4 waits=1 sigs=1 cmds=1 +[rtmod] FEW name=Minimum count=8192 +[rtmod] DISPATCH kernel=0 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=32768 alloc=32768 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=32768 alloc=32768 +[rtmod] bind[3] off=0 range=32768 alloc=32768 +[rtmod] FEW name=Multiply count=4194304 +[rtmod] DISPATCH kernel=469 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=4 alloc=4096 +[rtmod] bind[1] off=0 range=16777216 alloc=16777216 +[rtmod] bind[2] off=0 range=16777216 alloc=16777216 +[rtmod] bind[3] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58420 +[rtmod] SUBMIT tid=58420 cv=5 waits=1 sigs=1 cmds=1 +[rtmod] FEW name=Multiply count=8192 +[rtmod] DISPATCH kernel=469 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=4 alloc=4096 +[rtmod] bind[1] off=0 range=32768 alloc=32768 +[rtmod] bind[2] off=0 range=32768 alloc=32768 +[rtmod] bind[3] off=0 range=32768 alloc=32768 +[rtmod] FEW name=Add count=4194304 +[rtmod] DISPATCH kernel=469 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16777216 alloc=16777216 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=16777216 alloc=16777216 +[rtmod] bind[3] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58420 +[rtmod] SUBMIT tid=58420 cv=6 waits=1 sigs=1 cmds=1 +[rtmod] FEW name=Add count=8192 +[rtmod] DISPATCH kernel=469 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=32768 alloc=32768 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=32768 alloc=32768 +[rtmod] bind[3] off=0 range=32768 alloc=32768 +[rtmod] FEW name=ErfInv count=4194304 +[rtmod] DISPATCH kernel=0 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16777216 alloc=16777216 +[rtmod] bind[1] off=0 range=16777216 alloc=16777216 +[rtmod] bind[2] off=0 range=16777216 alloc=16777216 +[rtmod] bind[3] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58420 +[rtmod] SUBMIT tid=58420 cv=7 waits=1 sigs=1 cmds=1 +[rtmod] FEW name=ErfInv count=8192 +[rtmod] DISPATCH kernel=0 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=32768 alloc=32768 +[rtmod] bind[1] off=0 range=32768 alloc=32768 +[rtmod] bind[2] off=0 range=32768 alloc=32768 +[rtmod] bind[3] off=0 range=32768 alloc=32768 +[rtmod] FEW name=Multiply count=4194304 +[rtmod] DISPATCH kernel=469 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=4 alloc=4096 +[rtmod] bind[1] off=0 range=16777216 alloc=16777216 +[rtmod] bind[2] off=0 range=16777216 alloc=16777216 +[rtmod] bind[3] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58420 +[rtmod] SUBMIT tid=58420 cv=8 waits=1 sigs=1 cmds=1 +[rtmod] FEW name=Multiply count=8192 +[rtmod] DISPATCH kernel=469 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=4 alloc=4096 +[rtmod] bind[1] off=0 range=32768 alloc=32768 +[rtmod] bind[2] off=0 range=32768 alloc=32768 +[rtmod] bind[3] off=0 range=32768 alloc=32768 +[rtmod] DISPATCH kernel=10 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16777216 alloc=16777216 +[rtmod] bind[1] off=0 range=16777216 alloc=16777216 +[rtmod] bind[2] off=0 range=8388608 alloc=8388608 +[rtmod] SUBMIT-ENTER tid=58420 +[rtmod] SUBMIT tid=58420 cv=9 waits=1 sigs=1 cmds=1 +[rtmod] DISPATCH kernel=10 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=32768 alloc=32768 +[rtmod] bind[1] off=0 range=32768 alloc=32768 +[rtmod] bind[2] off=0 range=16384 alloc=16384 +[rtmod] DISPATCH kernel=428 count=65536 gx=256 gy=1 gz=1 +[rtmod] bind[0] off=0 range=8388608 alloc=8388608 +[rtmod] bind[1] off=0 range=2097152 alloc=2097152 +[rtmod] bind[2] off=0 range=131072 alloc=131072 +[rtmod] bind[3] off=0 range=131072 alloc=131072 +[rtmod] EV-SIGNAL tid=58420 ev=0x26fa93d0 val=1 st=0 host=0 +[rtmod] SUBMIT-ENTER tid=58420 +[rtmod] SUBMIT tid=58420 cv=10 waits=1 sigs=2 cmds=1 +[rtmod] COMMIT-NOOP +[rtmod] EV-WAIT tid=58420 ev=0x26fa93d0 val=1 cnt=0 resv=10 +[rtmod] COMMIT-NOOP +[rtmod] JOIN tid=58420 reason=explicit last=10 +MARK 0 +[rtmod] DISPATCH kernel=410 count=8192 gx=256 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16384 alloc=16384 +[rtmod] bind[1] off=0 range=2097152 alloc=2097152 +[rtmod] bind[2] off=0 range=131072 alloc=131072 +[rtmod] bind[3] off=0 range=131072 alloc=131072 +[rtmod] bind[4] off=0 range=16384 alloc=16384 +[rtmod] EV-SIGNAL tid=58420 ev=0x27043780 val=1 st=0 host=0 +[rtmod] SUBMIT-ENTER tid=58420 +[rtmod] SUBMIT tid=58420 cv=11 waits=0 sigs=2 cmds=1 +[rtmod] COMMIT-NOOP +[rtmod] EV-WAIT tid=58420 ev=0x27043780 val=1 cnt=0 resv=11 +[rtmod] COMMIT-NOOP +[rtmod] JOIN tid=58420 reason=explicit last=11 +END 0 +MARK 1 +[rtmod] DISPATCH kernel=547 count=8192 gx=256 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16384 alloc=16384 +[rtmod] bind[1] off=0 range=2097152 alloc=2097152 +[rtmod] bind[2] off=0 range=131072 alloc=131072 +[rtmod] bind[3] off=0 range=131072 alloc=131072 +[rtmod] bind[4] off=0 range=16384 alloc=16384 +[rtmod] EV-SIGNAL tid=58420 ev=0x26fa93d0 val=1 st=0 host=0 +[rtmod] SUBMIT-ENTER tid=58420 +[rtmod] SUBMIT tid=58420 cv=12 waits=0 sigs=2 cmds=1 +[rtmod] COMMIT-NOOP +[rtmod] EV-WAIT tid=58420 ev=0x26fa93d0 val=1 cnt=0 resv=12 +[rtmod] COMMIT-NOOP +[rtmod] JOIN tid=58420 reason=explicit last=12 +END 1 +[rtmod] COMMIT-NOOP +[rtmod] JOIN tid=58420 reason=explicit last=0 diff --git a/mseries/local-ai/receipts/2026-10-30-qmv-batch/dispatch-probe.log b/mseries/local-ai/receipts/2026-10-30-qmv-batch/dispatch-probe.log new file mode 100644 index 00000000..b6814f2f --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-qmv-batch/dispatch-probe.log @@ -0,0 +1,174 @@ +[rtmod] DISPATCH kernel=102 count=4 gx=1 gy=1 gz=1 +[rtmod] bind[0] off=0 range=8 alloc=4096 +[rtmod] bind[1] off=0 range=16 alloc=4096 +[rtmod] DISPATCH kernel=102 count=4 gx=1 gy=1 gz=1 +[rtmod] bind[0] off=0 range=8 alloc=4096 +[rtmod] bind[1] off=0 range=16 alloc=4096 +[rtmod] DISPATCH kernel=102 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16 alloc=4096 +[rtmod] bind[1] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58004 +[rtmod] SUBMIT tid=58004 cv=1 waits=0 sigs=1 cmds=1 +[rtmod] DISPATCH kernel=102 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16 alloc=4096 +[rtmod] bind[1] off=0 range=32768 alloc=32768 +[rtmod] DISPATCH kernel=14 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16777216 alloc=16777216 +[rtmod] bind[1] off=0 range=16777216 alloc=16777216 +[rtmod] bind[2] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58004 +[rtmod] SUBMIT tid=58004 cv=2 waits=1 sigs=1 cmds=1 +[rtmod] DISPATCH kernel=14 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=32768 alloc=32768 +[rtmod] bind[1] off=0 range=32768 alloc=32768 +[rtmod] bind[2] off=0 range=32768 alloc=32768 +[rtmod] FEW name=Divide count=4194304 +[rtmod] DISPATCH kernel=469 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16777216 alloc=16777216 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=16777216 alloc=16777216 +[rtmod] bind[3] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58004 +[rtmod] SUBMIT tid=58004 cv=3 waits=1 sigs=1 cmds=1 +[rtmod] FEW name=Subtract count=1 +[rtmod] DISPATCH kernel=469 count=1 gx=1 gy=1 gz=1 +[rtmod] bind[0] off=0 range=4 alloc=4096 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=4 alloc=4096 +[rtmod] bind[3] off=0 range=4 alloc=4096 +[rtmod] FEW name=Divide count=8192 +[rtmod] DISPATCH kernel=469 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=32768 alloc=32768 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=32768 alloc=32768 +[rtmod] bind[3] off=0 range=32768 alloc=32768 +[rtmod] FEW name=Subtract count=1 +[rtmod] DISPATCH kernel=469 count=1 gx=1 gy=1 gz=1 +[rtmod] bind[0] off=0 range=4 alloc=4096 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=4 alloc=4096 +[rtmod] bind[3] off=0 range=4 alloc=4096 +[rtmod] FEW name=Minimum count=4194304 +[rtmod] DISPATCH kernel=0 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16777216 alloc=16777216 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=16777216 alloc=16777216 +[rtmod] bind[3] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58004 +[rtmod] SUBMIT tid=58004 cv=4 waits=1 sigs=1 cmds=1 +[rtmod] FEW name=Minimum count=8192 +[rtmod] DISPATCH kernel=0 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=32768 alloc=32768 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=32768 alloc=32768 +[rtmod] bind[3] off=0 range=32768 alloc=32768 +[rtmod] FEW name=Multiply count=4194304 +[rtmod] DISPATCH kernel=469 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=4 alloc=4096 +[rtmod] bind[1] off=0 range=16777216 alloc=16777216 +[rtmod] bind[2] off=0 range=16777216 alloc=16777216 +[rtmod] bind[3] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58004 +[rtmod] SUBMIT tid=58004 cv=5 waits=1 sigs=1 cmds=1 +[rtmod] FEW name=Multiply count=8192 +[rtmod] DISPATCH kernel=469 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=4 alloc=4096 +[rtmod] bind[1] off=0 range=32768 alloc=32768 +[rtmod] bind[2] off=0 range=32768 alloc=32768 +[rtmod] bind[3] off=0 range=32768 alloc=32768 +[rtmod] FEW name=Add count=4194304 +[rtmod] DISPATCH kernel=469 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16777216 alloc=16777216 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=16777216 alloc=16777216 +[rtmod] bind[3] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58004 +[rtmod] SUBMIT tid=58004 cv=6 waits=1 sigs=1 cmds=1 +[rtmod] FEW name=Add count=8192 +[rtmod] DISPATCH kernel=469 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=32768 alloc=32768 +[rtmod] bind[1] off=0 range=4 alloc=4096 +[rtmod] bind[2] off=0 range=32768 alloc=32768 +[rtmod] bind[3] off=0 range=32768 alloc=32768 +[rtmod] FEW name=ErfInv count=4194304 +[rtmod] DISPATCH kernel=0 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16777216 alloc=16777216 +[rtmod] bind[1] off=0 range=16777216 alloc=16777216 +[rtmod] bind[2] off=0 range=16777216 alloc=16777216 +[rtmod] bind[3] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58004 +[rtmod] SUBMIT tid=58004 cv=7 waits=1 sigs=1 cmds=1 +[rtmod] FEW name=ErfInv count=8192 +[rtmod] DISPATCH kernel=0 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=32768 alloc=32768 +[rtmod] bind[1] off=0 range=32768 alloc=32768 +[rtmod] bind[2] off=0 range=32768 alloc=32768 +[rtmod] bind[3] off=0 range=32768 alloc=32768 +[rtmod] FEW name=Multiply count=4194304 +[rtmod] DISPATCH kernel=469 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=4 alloc=4096 +[rtmod] bind[1] off=0 range=16777216 alloc=16777216 +[rtmod] bind[2] off=0 range=16777216 alloc=16777216 +[rtmod] bind[3] off=0 range=16777216 alloc=16777216 +[rtmod] SUBMIT-ENTER tid=58004 +[rtmod] SUBMIT tid=58004 cv=8 waits=1 sigs=1 cmds=1 +[rtmod] FEW name=Multiply count=8192 +[rtmod] DISPATCH kernel=469 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=4 alloc=4096 +[rtmod] bind[1] off=0 range=32768 alloc=32768 +[rtmod] bind[2] off=0 range=32768 alloc=32768 +[rtmod] bind[3] off=0 range=32768 alloc=32768 +[rtmod] DISPATCH kernel=10 count=4194304 gx=16384 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16777216 alloc=16777216 +[rtmod] bind[1] off=0 range=16777216 alloc=16777216 +[rtmod] bind[2] off=0 range=8388608 alloc=8388608 +[rtmod] SUBMIT-ENTER tid=58004 +[rtmod] SUBMIT tid=58004 cv=9 waits=1 sigs=1 cmds=1 +[rtmod] DISPATCH kernel=10 count=8192 gx=32 gy=1 gz=1 +[rtmod] bind[0] off=0 range=32768 alloc=32768 +[rtmod] bind[1] off=0 range=32768 alloc=32768 +[rtmod] bind[2] off=0 range=16384 alloc=16384 +[rtmod] DISPATCH kernel=428 count=65536 gx=256 gy=1 gz=1 +[rtmod] bind[0] off=0 range=8388608 alloc=8388608 +[rtmod] bind[1] off=0 range=2097152 alloc=2097152 +[rtmod] bind[2] off=0 range=131072 alloc=131072 +[rtmod] bind[3] off=0 range=131072 alloc=131072 +[rtmod] EV-SIGNAL tid=58004 ev=0xa85e910 val=1 st=0 host=0 +[rtmod] SUBMIT-ENTER tid=58004 +[rtmod] SUBMIT tid=58004 cv=10 waits=1 sigs=2 cmds=1 +[rtmod] COMMIT-NOOP +[rtmod] EV-WAIT tid=58004 ev=0xa85e910 val=1 cnt=0 resv=10 +[rtmod] COMMIT-NOOP +[rtmod] JOIN tid=58004 reason=explicit last=10 +MARK 0 +[rtmod] DISPATCH kernel=410 count=8192 gx=256 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16384 alloc=16384 +[rtmod] bind[1] off=0 range=2097152 alloc=2097152 +[rtmod] bind[2] off=0 range=131072 alloc=131072 +[rtmod] bind[3] off=0 range=131072 alloc=131072 +[rtmod] bind[4] off=0 range=16384 alloc=16384 +[rtmod] EV-SIGNAL tid=58004 ev=0xa911a40 val=1 st=0 host=0 +[rtmod] SUBMIT-ENTER tid=58004 +[rtmod] SUBMIT tid=58004 cv=11 waits=0 sigs=2 cmds=1 +[rtmod] COMMIT-NOOP +[rtmod] EV-WAIT tid=58004 ev=0xa911a40 val=1 cnt=0 resv=11 +[rtmod] COMMIT-NOOP +[rtmod] JOIN tid=58004 reason=explicit last=11 +END 0 +MARK 1 +[rtmod] DISPATCH kernel=547 count=8192 gx=256 gy=1 gz=1 +[rtmod] bind[0] off=0 range=16384 alloc=16384 +[rtmod] bind[1] off=0 range=2097152 alloc=2097152 +[rtmod] bind[2] off=0 range=131072 alloc=131072 +[rtmod] bind[3] off=0 range=131072 alloc=131072 +[rtmod] bind[4] off=0 range=16384 alloc=16384 +[rtmod] EV-SIGNAL tid=58004 ev=0xa85e910 val=1 st=0 host=0 +[rtmod] SUBMIT-ENTER tid=58004 +[rtmod] SUBMIT tid=58004 cv=12 waits=0 sigs=2 cmds=1 +[rtmod] COMMIT-NOOP +[rtmod] EV-WAIT tid=58004 ev=0xa85e910 val=1 cnt=0 resv=12 +[rtmod] COMMIT-NOOP +[rtmod] JOIN tid=58004 reason=explicit last=12 +END 1 +[rtmod] COMMIT-NOOP +[rtmod] JOIN tid=58004 reason=explicit last=0 diff --git a/mseries/local-ai/receipts/2026-10-30-qmv-batch/dispatch-probe.py b/mseries/local-ai/receipts/2026-10-30-qmv-batch/dispatch-probe.py new file mode 100644 index 00000000..e1ca0095 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-qmv-batch/dispatch-probe.py @@ -0,0 +1,13 @@ +import os +import mlx.core as mx +mx.random.seed(7) +w0=mx.random.normal((2048,2048)).astype(mx.bfloat16) +w,s,b=mx.quantize(w0,group_size=64,bits=4) +x=mx.random.normal((4,1,2048)).astype(mx.bfloat16) +mx.eval(w,s,b,x); mx.synchronize() +for v in ('0','1'): + os.environ['MLX_OMARCHY_QMV_BATCH']=v + print('MARK',v,flush=True) + y=mx.quantized_matmul(x,w,s,b,transpose=True,group_size=64,bits=4) + mx.eval(y); mx.synchronize() + print('END',v,flush=True) diff --git a/mseries/local-ai/receipts/2026-10-30-qmv-batch/gate-candidate.json b/mseries/local-ai/receipts/2026-10-30-qmv-batch/gate-candidate.json new file mode 100644 index 00000000..627ef318 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-qmv-batch/gate-candidate.json @@ -0,0 +1,552 @@ +{ + "model": "mlx-community/Qwen3.5-2B-MLX-4bit@93760be4", + "weights_sha256": "713fe7e5d3c3965f7106b0d0ee17615f7869c23c8d327996df8c1196fbcf07d5", + "kernel": "7.2.11-elementary-aurora72-wip5", + "driver": "Honeykrisp Mesa 9323171c12", + "steps": 32, + "tie_margin": 0.5, + "margins": { + "pooled": 1.05, + "case": 1.15 + }, + "cases": [ + "rainbow", + "single", + "unicode", + "code", + "prose", + "math" + ], + "configs": { + "baseline": { + "env": {}, + "exit": 0, + "stopped": null, + "seconds": 13.2, + "min_available_gib": 18.37, + "peak_temp_c": 49.593, + "cases": { + "rainbow": { + "rmse": 0.031829616408239544, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 29108, + 4009, + 33060, + 1472, + 279, + 16078, + 321, + 5055, + 18766, + 21479, + 318, + 65, + 305, + 8, + 430, + 424, + 27891, + 264, + 10849, + 6508, + 13, + 198, + 760, + 3000, + 1179, + 25133, + 974, + 279, + 1142, + 314, + 279, + 6756 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 39.36584873622076 + }, + "single": { + "rmse": 0.04655662537948323, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 9419, + 0, + 2500, + 628, + 353, + 1438, + 488, + 30, + 248046, + 198, + 248044, + 248045, + 846, + 198, + 12675, + 248046, + 198, + 248045, + 74455, + 198, + 248068, + 271, + 248069, + 271, + 9419, + 0, + 2500, + 628, + 353, + 1438, + 488, + 30 + ], + "first_divergence_vs_reference": 24, + "decode_tok_s": 38.294310675166585 + }, + "unicode": { + "rmse": 0.04732244977098923, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 22961, + 1900, + 25213, + 1725, + 191718, + 72163, + 84146, + 11, + 307, + 16811, + 51424, + 6167, + 907, + 7925, + 10838, + 234, + 99, + 29545, + 248046, + 198, + 248044, + 248045, + 74455, + 271, + 248068, + 198, + 31248, + 11, + 353, + 1144, + 310, + 14260 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 38.57887404878213 + }, + "code": { + "rmse": 0.029475553767825832, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 71093, + 12305, + 198, + 12237, + 198, + 8275, + 1340, + 76938, + 27435, + 271, + 1919, + 4536, + 5529, + 264, + 709, + 310, + 10724, + 279, + 307, + 7324, + 76938, + 1324, + 198, + 940, + 449, + 83876, + 5313, + 11, + 864, + 369, + 777, + 4779 + ], + "first_divergence_vs_reference": 16, + "decode_tok_s": 40.018242483652635 + }, + "prose": { + "rmse": 0.028039759816311564, + "argmax_agree": 0.96875, + "non_tie_flips": [], + "ids": [ + 760, + 12433, + 2197, + 383, + 7348, + 310, + 3286, + 279, + 7786, + 364, + 279, + 491, + 6522, + 19403, + 11, + 694, + 1238, + 264, + 33073, + 9915, + 383, + 6829, + 11, + 61892, + 11, + 321, + 279, + 7832, + 24024, + 11, + 781, + 6426 + ], + "first_divergence_vs_reference": 20, + "decode_tok_s": 36.1710539502568 + }, + "math": { + "rmse": 0.03005468944964068, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 1206, + 1423, + 279, + 18085, + 854, + 11, + 567, + 1144, + 310, + 10724, + 279, + 2702, + 854, + 4284, + 310, + 5640, + 279, + 5821, + 321, + 1179, + 884, + 421, + 7836, + 310, + 279, + 24125, + 854, + 13, + 271, + 13962, + 14392, + 220 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 39.16857997494406 + } + }, + "violations": [], + "pooled_rmse": 0.03646546050291926, + "median_decode_tok_s": 39.16857997494406, + "pass": true, + "gate": "PASS" + }, + "work120k": { + "env": { + "MLX_OMARCHY_BATCH_WORK": "120000" + }, + "exit": 0, + "stopped": null, + "seconds": 14.2, + "min_available_gib": 17.69, + "peak_temp_c": 49.286, + "cases": { + "rainbow": { + "rmse": 0.031829616408239544, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 29108, + 4009, + 33060, + 1472, + 279, + 16078, + 321, + 5055, + 18766, + 21479, + 318, + 65, + 305, + 8, + 430, + 424, + 27891, + 264, + 10849, + 6508, + 13, + 198, + 760, + 3000, + 1179, + 25133, + 974, + 279, + 1142, + 314, + 279, + 6756 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 26.611093569681, + "first_divergence_vs_baseline": null + }, + "single": { + "rmse": 0.04655662537948323, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 9419, + 0, + 2500, + 628, + 353, + 1438, + 488, + 30, + 248046, + 198, + 248044, + 248045, + 846, + 198, + 12675, + 248046, + 198, + 248045, + 74455, + 198, + 248068, + 271, + 248069, + 271, + 9419, + 0, + 2500, + 628, + 353, + 1438, + 488, + 30 + ], + "first_divergence_vs_reference": 24, + "decode_tok_s": 28.39248520817104, + "first_divergence_vs_baseline": null + }, + "unicode": { + "rmse": 0.04732244977098923, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 22961, + 1900, + 25213, + 1725, + 191718, + 72163, + 84146, + 11, + 307, + 16811, + 51424, + 6167, + 907, + 7925, + 10838, + 234, + 99, + 29545, + 248046, + 198, + 248044, + 248045, + 74455, + 271, + 248068, + 198, + 31248, + 11, + 353, + 1144, + 310, + 14260 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 27.564966284050175, + "first_divergence_vs_baseline": null + }, + "code": { + "rmse": 0.029475553767825832, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 71093, + 12305, + 198, + 12237, + 198, + 8275, + 1340, + 76938, + 27435, + 271, + 1919, + 4536, + 5529, + 264, + 709, + 310, + 10724, + 279, + 307, + 7324, + 76938, + 1324, + 198, + 940, + 449, + 83876, + 5313, + 11, + 864, + 369, + 777, + 4779 + ], + "first_divergence_vs_reference": 16, + "decode_tok_s": 28.519475129862737, + "first_divergence_vs_baseline": null + }, + "prose": { + "rmse": 0.028039759816311564, + "argmax_agree": 0.96875, + "non_tie_flips": [], + "ids": [ + 760, + 12433, + 2197, + 383, + 7348, + 310, + 3286, + 279, + 7786, + 364, + 279, + 491, + 6522, + 19403, + 11, + 694, + 1238, + 264, + 33073, + 9915, + 383, + 6829, + 11, + 61892, + 11, + 321, + 279, + 7832, + 24024, + 11, + 781, + 6426 + ], + "first_divergence_vs_reference": 20, + "decode_tok_s": 27.882643801489795, + "first_divergence_vs_baseline": null + }, + "math": { + "rmse": 0.03005468944964068, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 1206, + 1423, + 279, + 18085, + 854, + 11, + 567, + 1144, + 310, + 10724, + 279, + 2702, + 854, + 4284, + 310, + 5640, + 279, + 5821, + 321, + 1179, + 884, + 421, + 7836, + 310, + 279, + 24125, + 854, + 13, + 271, + 13962, + 14392, + 220 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 27.719881997462814, + "first_divergence_vs_baseline": null + } + }, + "violations": [], + "pooled_rmse": 0.03646546050291926, + "median_decode_tok_s": 27.882643801489795, + "pass": true, + "gate": "PASS" + } + } +} diff --git a/mseries/local-ai/receipts/2026-10-30-qmv-batch/gate-live.json b/mseries/local-ai/receipts/2026-10-30-qmv-batch/gate-live.json new file mode 100644 index 00000000..9b14cdf3 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-qmv-batch/gate-live.json @@ -0,0 +1,552 @@ +{ + "model": "mlx-community/Qwen3.5-2B-MLX-4bit@93760be4", + "weights_sha256": "713fe7e5d3c3965f7106b0d0ee17615f7869c23c8d327996df8c1196fbcf07d5", + "kernel": "7.2.11-elementary-aurora72-wip5", + "driver": "Honeykrisp Mesa 9323171c12", + "steps": 32, + "tie_margin": 0.5, + "margins": { + "pooled": 1.05, + "case": 1.15 + }, + "cases": [ + "rainbow", + "single", + "unicode", + "code", + "prose", + "math" + ], + "configs": { + "baseline": { + "env": {}, + "exit": 0, + "stopped": null, + "seconds": 13.2, + "min_available_gib": 18.1, + "peak_temp_c": 48.94, + "cases": { + "rainbow": { + "rmse": 0.031829616408239544, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 29108, + 4009, + 33060, + 1472, + 279, + 16078, + 321, + 5055, + 18766, + 21479, + 318, + 65, + 305, + 8, + 430, + 424, + 27891, + 264, + 10849, + 6508, + 13, + 198, + 760, + 3000, + 1179, + 25133, + 974, + 279, + 1142, + 314, + 279, + 6756 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 39.28561312527005 + }, + "single": { + "rmse": 0.04655662537948323, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 9419, + 0, + 2500, + 628, + 353, + 1438, + 488, + 30, + 248046, + 198, + 248044, + 248045, + 846, + 198, + 12675, + 248046, + 198, + 248045, + 74455, + 198, + 248068, + 271, + 248069, + 271, + 9419, + 0, + 2500, + 628, + 353, + 1438, + 488, + 30 + ], + "first_divergence_vs_reference": 24, + "decode_tok_s": 39.366779909994456 + }, + "unicode": { + "rmse": 0.04732244977098923, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 22961, + 1900, + 25213, + 1725, + 191718, + 72163, + 84146, + 11, + 307, + 16811, + 51424, + 6167, + 907, + 7925, + 10838, + 234, + 99, + 29545, + 248046, + 198, + 248044, + 248045, + 74455, + 271, + 248068, + 198, + 31248, + 11, + 353, + 1144, + 310, + 14260 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 38.77720502066353 + }, + "code": { + "rmse": 0.029475553767825832, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 71093, + 12305, + 198, + 12237, + 198, + 8275, + 1340, + 76938, + 27435, + 271, + 1919, + 4536, + 5529, + 264, + 709, + 310, + 10724, + 279, + 307, + 7324, + 76938, + 1324, + 198, + 940, + 449, + 83876, + 5313, + 11, + 864, + 369, + 777, + 4779 + ], + "first_divergence_vs_reference": 16, + "decode_tok_s": 37.74406517919473 + }, + "prose": { + "rmse": 0.028039759816311564, + "argmax_agree": 0.96875, + "non_tie_flips": [], + "ids": [ + 760, + 12433, + 2197, + 383, + 7348, + 310, + 3286, + 279, + 7786, + 364, + 279, + 491, + 6522, + 19403, + 11, + 694, + 1238, + 264, + 33073, + 9915, + 383, + 6829, + 11, + 61892, + 11, + 321, + 279, + 7832, + 24024, + 11, + 781, + 6426 + ], + "first_divergence_vs_reference": 20, + "decode_tok_s": 39.44941234004726 + }, + "math": { + "rmse": 0.03005468944964068, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 1206, + 1423, + 279, + 18085, + 854, + 11, + 567, + 1144, + 310, + 10724, + 279, + 2702, + 854, + 4284, + 310, + 5640, + 279, + 5821, + 321, + 1179, + 884, + 421, + 7836, + 310, + 279, + 24125, + 854, + 13, + 271, + 13962, + 14392, + 220 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 40.33071362105133 + } + }, + "violations": [], + "pooled_rmse": 0.03646546050291926, + "median_decode_tok_s": 39.366779909994456, + "pass": true, + "gate": "PASS" + }, + "work120k": { + "env": { + "MLX_OMARCHY_BATCH_WORK": "120000" + }, + "exit": 0, + "stopped": null, + "seconds": 14.2, + "min_available_gib": 17.31, + "peak_temp_c": 49.186, + "cases": { + "rainbow": { + "rmse": 0.031829616408239544, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 29108, + 4009, + 33060, + 1472, + 279, + 16078, + 321, + 5055, + 18766, + 21479, + 318, + 65, + 305, + 8, + 430, + 424, + 27891, + 264, + 10849, + 6508, + 13, + 198, + 760, + 3000, + 1179, + 25133, + 974, + 279, + 1142, + 314, + 279, + 6756 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 28.298550086818953, + "first_divergence_vs_baseline": null + }, + "single": { + "rmse": 0.04655662537948323, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 9419, + 0, + 2500, + 628, + 353, + 1438, + 488, + 30, + 248046, + 198, + 248044, + 248045, + 846, + 198, + 12675, + 248046, + 198, + 248045, + 74455, + 198, + 248068, + 271, + 248069, + 271, + 9419, + 0, + 2500, + 628, + 353, + 1438, + 488, + 30 + ], + "first_divergence_vs_reference": 24, + "decode_tok_s": 29.196909606572042, + "first_divergence_vs_baseline": null + }, + "unicode": { + "rmse": 0.04732244977098923, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 22961, + 1900, + 25213, + 1725, + 191718, + 72163, + 84146, + 11, + 307, + 16811, + 51424, + 6167, + 907, + 7925, + 10838, + 234, + 99, + 29545, + 248046, + 198, + 248044, + 248045, + 74455, + 271, + 248068, + 198, + 31248, + 11, + 353, + 1144, + 310, + 14260 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 28.22016050341937, + "first_divergence_vs_baseline": null + }, + "code": { + "rmse": 0.029475553767825832, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 71093, + 12305, + 198, + 12237, + 198, + 8275, + 1340, + 76938, + 27435, + 271, + 1919, + 4536, + 5529, + 264, + 709, + 310, + 10724, + 279, + 307, + 7324, + 76938, + 1324, + 198, + 940, + 449, + 83876, + 5313, + 11, + 864, + 369, + 777, + 4779 + ], + "first_divergence_vs_reference": 16, + "decode_tok_s": 27.55159503214122, + "first_divergence_vs_baseline": null + }, + "prose": { + "rmse": 0.028039759816311564, + "argmax_agree": 0.96875, + "non_tie_flips": [], + "ids": [ + 760, + 12433, + 2197, + 383, + 7348, + 310, + 3286, + 279, + 7786, + 364, + 279, + 491, + 6522, + 19403, + 11, + 694, + 1238, + 264, + 33073, + 9915, + 383, + 6829, + 11, + 61892, + 11, + 321, + 279, + 7832, + 24024, + 11, + 781, + 6426 + ], + "first_divergence_vs_reference": 20, + "decode_tok_s": 27.5811598695036, + "first_divergence_vs_baseline": null + }, + "math": { + "rmse": 0.03005468944964068, + "argmax_agree": 1.0, + "non_tie_flips": [], + "ids": [ + 1206, + 1423, + 279, + 18085, + 854, + 11, + 567, + 1144, + 310, + 10724, + 279, + 2702, + 854, + 4284, + 310, + 5640, + 279, + 5821, + 321, + 1179, + 884, + 421, + 7836, + 310, + 279, + 24125, + 854, + 13, + 271, + 13962, + 14392, + 220 + ], + "first_divergence_vs_reference": null, + "decode_tok_s": 27.81413948145633, + "first_divergence_vs_baseline": null + } + }, + "violations": [], + "pooled_rmse": 0.03646546050291926, + "median_decode_tok_s": 28.22016050341937, + "pass": true, + "gate": "PASS" + } + } +} diff --git a/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/README.md b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/README.md new file mode 100644 index 00000000..de47cb63 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/README.md @@ -0,0 +1,23 @@ +# TensorFold Vulkan draft on J314S — 2026-10-30 + +Built [TensorFold PR #1544](https://github.com/ashhart/TensorFold/pull/1544) draft head `b3ab9ba217a80c63fcc48f7643ddfe339a8f4bdc` in a private cache using the project's pinned Zig 0.17.0 archive and `ReleaseSafe`, two build jobs. This head diverged from the previously pinned `92bb49db` (165 commits ahead and 32 behind in GitHub's comparison); it is not just a fast-batching patch. The built server SHA-256 is `eae8c9f955f39d2be33af57cbfe254225fb2a8a349d577b749743e174e89511b`. No service or default was changed. + +The existing `tensorfold-vulkan.sh` was copied locally, its revision replaced for this isolated build, and build parallelism limited to two. Its host suite exited 0; a cached summary reports 111/111 steps succeeded and one skip in the displayed test group. All five GPU stage checks passed. All six contract groups passed, including planted controls and live device limits; pointwise reports the documented known fp32 denormal flush (`shaderDenormPreserveFloat32=false`). [GPU stages](gpu.log) and [contract](contract.log) retain details. The GPU runs held the shared worker lock and monitored the 6 GiB memory reserve and 80°C limit, with 2 GiB admission allowance. + +The guarded `engine-compare.py` was copied locally with only its TensorFold binary path and revision changed. It used Qwen3.5-2B MLX 4-bit pinned weights, 32 greedy tokens, three rotated fresh-process rounds and one warmup per round, with the shared lock, 4.5 GiB admission allowance, 6 GiB reserve and 80°C limit. Both arms produced the same text hash in all runs. TensorFold's loopback HTTP server had median 1.914 s time to first token and 2.89 reported decode tokens/s; the installed MLX in-process arm with a 120k work budget had 0.423 s and 54.51 tokens/s. These use different timing boundaries and are not a direct engine speed ratio. See [raw comparison](compare-short.json). + +A subsequent single long comparison used the same long prompt and 256-token limit as the earlier project trial. Both runs completed without a guard stop; their text diverged after 880 common characters (MLX output 1,301 characters, TensorFold 1,304), the same prefix length as the earlier recorded trial. TensorFold's loopback request reported 2.79 decode tokens/s and 94.48 s total; MLX's in-process request reported 56.19 tokens/s and 5.03 s total, with different timing boundaries. [Long comparison](compare-long.json). This is one pair and a text difference, not a diagnosis of incorrect logits or a statistical speed comparison. + +A teacher-forced follow-up reused the project's cached **CPU float32**, not FP64, Qwen 2B reference for the short rainbow prompt. Its 27 prompt IDs were regenerated from the same local tokenizer and matched the reference's prompt hash; the 32 reference generated IDs and their hashes formed the oracle. Reference logits were rounded to BF16 for the probe's diagnostic file, while the numerical calculation below uses the original float32 rows. The existing upstream `tf-qwen35-model --vendor 0x10005 --context 256 --teacher-forced` ran twice under the worker lock with a 4.5 GiB allowance, 6 GiB reserve and 80°C limit. + +Both TensorFold runs matched all 32 oracle argmax IDs and were byte-identical to each other. All values were finite; versus the original float32 CPU reference the BF16 logits had RMSE 0.02884, compared with the installed MLX baseline's 0.03183 on these same rows (ratio 0.906, within the project's 1.15 per-case bound). This is one short case, not the full multi-case gate, the upstream FP64 fidelity gate, or an explanation of the later long-response divergence. The probe reports 6,437,111 unequal BF16 elements against the rounded CPU reference, so matching token IDs do not imply identical logits. [Probe result](teacher-result.json), [analysis](teacher-analysis.json), [log](teacher.log); the 16 MB logit matrices and oracle remain in the private cache. + +The same teacher-forced procedure was then applied to the remaining five cached CPU float32 cases (32 rows each), holding the same worker lock and resource guards. Across all six cases, TensorFold logits were finite and repeated byte-for-byte. Pooled RMSE was 0.03526 versus the installed MLX baseline's 0.03647 (ratio 0.967, below the project's 1.05 pooled bound); the worst per-case ratio was 1.049, below its 1.15 case bound. There were no argmax flips where the CPU reference's top-two margin was at least 0.5. These are the project's numerical and margin checks, not a complete pass of its gate: free-running checks were not performed for all six, and the reference is float32 rather than the upstream FP64 gate. + +The upstream probe's stricter exact-ID criterion **failed** in `single` and `code` (exit 1, same failures in both repeated runs). Against the CPU's teacher-forced argmax rows, the only differences were row 24 in `single` (reference margin 0.0041) and row 16 in `code` (margin 0.10039), both under the project's 0.5 near-tie threshold. The other four cases met exact-ID equality. Do not relabel the probe failures as passes: the project margin rule and the probe's exact-ID rule answer different questions. [Five additional case results and logs](multicase-results.json). + +For the long prompt, regenerated 256 installed-MLX greedy IDs; the resulting text exactly matched the retained MLX response. A separate CPU float32 forward computed all 256 teacher-forced logit rows for those IDs. The upstream TensorFold probe, fed the same 41-token prompt and 256 generated IDs at context 384, completed twice with identical logits and IDs, but **failed exact-ID matching** at zero-based row 167, its only differing selection. The retained MLX tokens before that row decode to the first 879 characters of the response; the next tokens decode to ` Red` (MLX incremental) and ` This` (TensorFold), consistent with the 880-character common prefix in the free-running comparison. + +At row 167 the CPU float32 reference preferred ` Red` (token 3605) over ` This` (1061) by 0.08872, below the project's 0.5 near-tie threshold. TensorFold's BF16 logits rounded both to 20.125 and selected 1061; a separate installed-MLX **full-pass teacher-forced** calculation also selected 1061. Across the 256 rows, TensorFold and full-pass MLX each differed from the CPU argmax only at this same near tie; TensorFold RMSE versus CPU was 0.02758 and MLX's was 0.02963 (ratio 0.931). This supports a near-tie explanation for the observed divergence, but does not establish the precise source of numerical variation or general fidelity. [Probe result](teacher-long-result.json), [analysis](teacher-long-analysis.json), [log](teacher-long.log). The CPU and MLX float32 matrices remain in the private cache, SHA-256 `aff5fd4bbfbc4e6c9023809f38c029f279e9ea06ee845654007f407e44f2d2f5` and `0efe2efe9397fde400cc1e6c322c664de94d245a95599632f61b08d09cc8a6fd` respectively. The CPU job ran 397.2 seconds under the shared worker lock, a 6 GiB reserve, 8 GiB admission allowance and 80°C limit. + +This single long-prompt analysis is not the upstream FP64 gate. Sustained desktop responsiveness and submit-batching A/B remain unrun; the separate batching follow-up is not established by this draft's results. Keep the existing runtime; these checks do not qualify a replacement. diff --git a/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/compare-long.json b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/compare-long.json new file mode 100644 index 00000000..acfbf3c9 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/compare-long.json @@ -0,0 +1,1266 @@ +{ + "status": "complete", + "model_key": "qwen2b", + "model": "mlx-community/Qwen3.5-2B-MLX-4bit@93760be4f1f69842a46bc13dbdc0f19e291392a3", + "weights_sha256": "713fe7e5d3c3965f7106b0d0ee17615f7869c23c8d327996df8c1196fbcf07d5", + "kernel": "7.2.11-elementary-aurora72-wip5", + "driver": "Honeykrisp Mesa 9323171c12", + "tensorfold_rev": "b3ab9ba217a80c63fcc48f7643ddfe339a8f4bdc", + "rapid_rev": "1d09cdb684bbf58fac130f5804b08ee2e1f56558", + "serve_concurrency": 4, + "prompt_sha256": "2f23962cfdcb7ce0c2b482c4dd71e415f72113b963cfe6594fd5dc1fd4347921", + "max_tokens": 256, + "policy": { + "reserve_gib": 6, + "max_fan_rpm": null, + "max_temp_c": 80 + }, + "allowance_gib": 4.5, + "arms": [ + "mlx-120k", + "tensorfold" + ], + "concurrency": 1, + "runs": [ + { + "arm": "mlx-120k", + "stopped": null, + "samples": [ + { + "t": 0.01, + "available_gib": 20.261, + "max_temp_c": 43.282, + "max_fan_rpm": 2515.0 + }, + { + "t": 1.01, + "available_gib": 19.236, + "max_temp_c": 42.864, + "max_fan_rpm": 2511.0 + }, + { + "t": 2.02, + "available_gib": 18.837, + "max_temp_c": 43.532, + "max_fan_rpm": 2494.0 + }, + { + "t": 3.03, + "available_gib": 18.56, + "max_temp_c": 42.25, + "max_fan_rpm": 2477.0 + }, + { + "t": 4.04, + "available_gib": 18.451, + "max_temp_c": 43.326, + "max_fan_rpm": 2511.0 + }, + { + "t": 5.06, + "available_gib": 18.436, + "max_temp_c": 42.603, + "max_fan_rpm": 2469.0 + }, + { + "t": 6.07, + "available_gib": 18.456, + "max_temp_c": 43.364, + "max_fan_rpm": 2525.0 + }, + { + "t": 7.07, + "available_gib": 18.453, + "max_temp_c": 42.456, + "max_fan_rpm": 2507.0 + }, + { + "t": 8.09, + "available_gib": 18.293, + "max_temp_c": 42.847, + "max_fan_rpm": 2494.0 + }, + { + "t": 9.11, + "available_gib": 18.27, + "max_temp_c": 43.282, + "max_fan_rpm": 2512.0 + }, + { + "t": 10.12, + "available_gib": 18.286, + "max_temp_c": 42.625, + "max_fan_rpm": 2490.0 + }, + { + "t": 11.15, + "available_gib": 18.296, + "max_temp_c": 43.114, + "max_fan_rpm": 2503.0 + }, + { + "t": 12.16, + "available_gib": 18.521, + "max_temp_c": 43.027, + "max_fan_rpm": 2507.0 + } + ], + "log_tail": "", + "ready_s": 7.631538032000208, + "ttft_s": 0.49659852400009186, + "total_s": 5.034850170000027, + "completion_tokens": 256, + "text": "A rainbow is a spectacular natural phenomenon that occurs when sunlight interacts with water droplets in the atmosphere, creating a spectrum of colors that we see in the sky. This optical effect is a complex interplay of physics involving refraction, reflection, dispersion, and the viewing angle. To understand how a rainbow forms, one must first consider the properties of light and the behavior of water droplets.\n\nThe process begins with the entry of sunlight into a water droplet. Sunlight is composed of all visible wavelengths of the electromagnetic spectrum, ranging from red to violet. As these rays enter the droplet, they encounter a medium with a higher refractive index than air. Consequently, the light slows down and bends, a process known as refraction. Because different wavelengths of light travel at different speeds, they refract at slightly different angles. Red light, having the longest wavelength, bends the least, while violet light, with the shortest wavelength, bends the most. This separation of colors is called dispersion.\n\nUpon entering the droplet, the light ray undergoes a second refraction as it exits the back of the droplet. However, the path of the light ray is not a straight line; it curves inward as it travels through the droplet. This curvature is the result", + "text_sha256": "3f3ac70c5d72eda0b31229d8da4d90ca6fce34ca69e6ebc24a3d6502fc816990", + "decode_tps": 56.189039280084835, + "min_available_gib": 18.27, + "peak_temp_c": 43.532, + "round": 1, + "admission_available_gib": 20.261 + }, + { + "arm": "tensorfold", + "stopped": null, + "samples": [ + { + "t": 0.02, + "available_gib": 20.109, + "max_temp_c": 43.065, + "max_fan_rpm": 2494.0 + }, + { + "t": 1.03, + "available_gib": 18.766, + "max_temp_c": 43.326, + "max_fan_rpm": 2511.0 + }, + { + "t": 2.04, + "available_gib": 18.746, + "max_temp_c": 43.913, + "max_fan_rpm": 2503.0 + }, + { + "t": 3.05, + "available_gib": 18.822, + "max_temp_c": 43.701, + "max_fan_rpm": 2502.0 + }, + { + "t": 4.07, + "available_gib": 18.831, + "max_temp_c": 43.532, + "max_fan_rpm": 2506.0 + }, + { + "t": 5.08, + "available_gib": 18.828, + "max_temp_c": 43.619, + "max_fan_rpm": 2511.0 + }, + { + "t": 6.09, + "available_gib": 18.819, + "max_temp_c": 43.668, + "max_fan_rpm": 2511.0 + }, + { + "t": 7.1, + "available_gib": 18.819, + "max_temp_c": 43.864, + "max_fan_rpm": 2506.0 + }, + { + "t": 8.12, + "available_gib": 18.817, + "max_temp_c": 43.711, + "max_fan_rpm": 2473.0 + }, + { + "t": 9.13, + "available_gib": 18.821, + "max_temp_c": 43.711, + "max_fan_rpm": 2511.0 + }, + { + "t": 10.14, + "available_gib": 18.814, + "max_temp_c": 44.206, + "max_fan_rpm": 2490.0 + }, + { + "t": 11.15, + "available_gib": 18.817, + "max_temp_c": 43.413, + "max_fan_rpm": 2515.0 + }, + { + "t": 12.17, + "available_gib": 18.823, + "max_temp_c": 43.75, + "max_fan_rpm": 2506.0 + }, + { + "t": 13.19, + "available_gib": 18.83, + "max_temp_c": 44.005, + "max_fan_rpm": 2502.0 + }, + { + "t": 14.21, + "available_gib": 18.833, + "max_temp_c": 44.385, + "max_fan_rpm": 2485.0 + }, + { + "t": 15.22, + "available_gib": 18.837, + "max_temp_c": 43.711, + "max_fan_rpm": 2506.0 + }, + { + "t": 16.24, + "available_gib": 18.838, + "max_temp_c": 43.021, + "max_fan_rpm": 2511.0 + }, + { + "t": 17.25, + "available_gib": 18.855, + "max_temp_c": 44.043, + "max_fan_rpm": 2503.0 + }, + { + "t": 18.27, + "available_gib": 18.865, + "max_temp_c": 43.5, + "max_fan_rpm": 2490.0 + }, + { + "t": 19.29, + "available_gib": 18.875, + "max_temp_c": 43.875, + "max_fan_rpm": 2511.0 + }, + { + "t": 20.31, + "available_gib": 18.899, + "max_temp_c": 43.326, + "max_fan_rpm": 2494.0 + }, + { + "t": 21.34, + "available_gib": 18.894, + "max_temp_c": 44.26, + "max_fan_rpm": 2493.0 + }, + { + "t": 22.35, + "available_gib": 18.897, + "max_temp_c": 44.168, + "max_fan_rpm": 2494.0 + }, + { + "t": 23.36, + "available_gib": 18.886, + "max_temp_c": 43.836, + "max_fan_rpm": 2506.0 + }, + { + "t": 24.39, + "available_gib": 18.91, + "max_temp_c": 43.065, + "max_fan_rpm": 2506.0 + }, + { + "t": 25.4, + "available_gib": 18.919, + "max_temp_c": 43.798, + "max_fan_rpm": 2489.0 + }, + { + "t": 26.41, + "available_gib": 18.919, + "max_temp_c": 43.663, + "max_fan_rpm": 2516.0 + }, + { + "t": 27.43, + "available_gib": 18.905, + "max_temp_c": 43.875, + "max_fan_rpm": 2511.0 + }, + { + "t": 28.45, + "available_gib": 18.907, + "max_temp_c": 44.711, + "max_fan_rpm": 2507.0 + }, + { + "t": 29.46, + "available_gib": 18.909, + "max_temp_c": 43.581, + "max_fan_rpm": 2494.0 + }, + { + "t": 30.48, + "available_gib": 18.917, + "max_temp_c": 44.385, + "max_fan_rpm": 2511.0 + }, + { + "t": 31.5, + "available_gib": 18.917, + "max_temp_c": 44.994, + "max_fan_rpm": 2503.0 + }, + { + "t": 32.51, + "available_gib": 18.924, + "max_temp_c": 43.326, + "max_fan_rpm": 2486.0 + }, + { + "t": 33.53, + "available_gib": 18.933, + "max_temp_c": 44.423, + "max_fan_rpm": 2512.0 + }, + { + "t": 34.54, + "available_gib": 18.936, + "max_temp_c": 44.092, + "max_fan_rpm": 2511.0 + }, + { + "t": 35.56, + "available_gib": 18.939, + "max_temp_c": 43.875, + "max_fan_rpm": 2502.0 + }, + { + "t": 36.59, + "available_gib": 18.943, + "max_temp_c": 44.168, + "max_fan_rpm": 2511.0 + }, + { + "t": 37.61, + "available_gib": 18.946, + "max_temp_c": 44.369, + "max_fan_rpm": 2485.0 + }, + { + "t": 38.62, + "available_gib": 18.95, + "max_temp_c": 43.195, + "max_fan_rpm": 2494.0 + }, + { + "t": 39.64, + "available_gib": 18.952, + "max_temp_c": 44.385, + "max_fan_rpm": 2494.0 + }, + { + "t": 40.65, + "available_gib": 18.961, + "max_temp_c": 43.369, + "max_fan_rpm": 2507.0 + }, + { + "t": 41.67, + "available_gib": 18.964, + "max_temp_c": 43.75, + "max_fan_rpm": 2485.0 + }, + { + "t": 42.68, + "available_gib": 18.966, + "max_temp_c": 43.668, + "max_fan_rpm": 2515.0 + }, + { + "t": 43.7, + "available_gib": 18.968, + "max_temp_c": 44.168, + "max_fan_rpm": 2503.0 + }, + { + "t": 44.72, + "available_gib": 18.971, + "max_temp_c": 43.836, + "max_fan_rpm": 2507.0 + }, + { + "t": 45.73, + "available_gib": 18.974, + "max_temp_c": 44.353, + "max_fan_rpm": 2511.0 + }, + { + "t": 46.75, + "available_gib": 18.977, + "max_temp_c": 43.619, + "max_fan_rpm": 2515.0 + }, + { + "t": 47.78, + "available_gib": 18.977, + "max_temp_c": 44.652, + "max_fan_rpm": 2485.0 + }, + { + "t": 48.8, + "available_gib": 18.985, + "max_temp_c": 43.369, + "max_fan_rpm": 2524.0 + }, + { + "t": 49.8, + "available_gib": 18.973, + "max_temp_c": 43.581, + "max_fan_rpm": 2507.0 + }, + { + "t": 50.82, + "available_gib": 18.984, + "max_temp_c": 44.005, + "max_fan_rpm": 2511.0 + }, + { + "t": 51.83, + "available_gib": 18.984, + "max_temp_c": 44.005, + "max_fan_rpm": 2489.0 + }, + { + "t": 52.84, + "available_gib": 18.985, + "max_temp_c": 44.836, + "max_fan_rpm": 2511.0 + }, + { + "t": 53.86, + "available_gib": 18.989, + "max_temp_c": 43.63, + "max_fan_rpm": 2490.0 + }, + { + "t": 54.87, + "available_gib": 18.991, + "max_temp_c": 43.581, + "max_fan_rpm": 2510.0 + }, + { + "t": 55.89, + "available_gib": 18.996, + "max_temp_c": 43.494, + "max_fan_rpm": 2485.0 + }, + { + "t": 56.9, + "available_gib": 18.996, + "max_temp_c": 43.711, + "max_fan_rpm": 2506.0 + }, + { + "t": 57.92, + "available_gib": 18.993, + "max_temp_c": 44.293, + "max_fan_rpm": 2507.0 + }, + { + "t": 58.93, + "available_gib": 18.994, + "max_temp_c": 44.559, + "max_fan_rpm": 2503.0 + }, + { + "t": 59.94, + "available_gib": 18.996, + "max_temp_c": 43.75, + "max_fan_rpm": 2511.0 + }, + { + "t": 60.96, + "available_gib": 18.992, + "max_temp_c": 43.701, + "max_fan_rpm": 2494.0 + }, + { + "t": 61.97, + "available_gib": 18.996, + "max_temp_c": 44.516, + "max_fan_rpm": 2490.0 + }, + { + "t": 62.99, + "available_gib": 18.994, + "max_temp_c": 43.581, + "max_fan_rpm": 2507.0 + }, + { + "t": 64.01, + "available_gib": 18.996, + "max_temp_c": 43.711, + "max_fan_rpm": 2490.0 + }, + { + "t": 65.02, + "available_gib": 18.995, + "max_temp_c": 43.239, + "max_fan_rpm": 2494.0 + }, + { + "t": 66.04, + "available_gib": 18.999, + "max_temp_c": 43.63, + "max_fan_rpm": 2515.0 + }, + { + "t": 67.06, + "available_gib": 18.998, + "max_temp_c": 44.043, + "max_fan_rpm": 2494.0 + }, + { + "t": 68.09, + "available_gib": 18.995, + "max_temp_c": 43.152, + "max_fan_rpm": 2507.0 + }, + { + "t": 69.1, + "available_gib": 18.992, + "max_temp_c": 43.195, + "max_fan_rpm": 2494.0 + }, + { + "t": 70.11, + "available_gib": 18.999, + "max_temp_c": 43.282, + "max_fan_rpm": 2485.0 + }, + { + "t": 71.12, + "available_gib": 19.0, + "max_temp_c": 44.081, + "max_fan_rpm": 2511.0 + }, + { + "t": 72.14, + "available_gib": 18.931, + "max_temp_c": 43.782, + "max_fan_rpm": 2503.0 + }, + { + "t": 73.15, + "available_gib": 18.947, + "max_temp_c": 43.711, + "max_fan_rpm": 2503.0 + }, + { + "t": 74.16, + "available_gib": 18.947, + "max_temp_c": 43.663, + "max_fan_rpm": 2511.0 + }, + { + "t": 75.19, + "available_gib": 18.947, + "max_temp_c": 43.581, + "max_fan_rpm": 2503.0 + }, + { + "t": 76.21, + "available_gib": 18.947, + "max_temp_c": 43.451, + "max_fan_rpm": 2511.0 + }, + { + "t": 77.22, + "available_gib": 18.947, + "max_temp_c": 44.222, + "max_fan_rpm": 2494.0 + }, + { + "t": 78.24, + "available_gib": 18.943, + "max_temp_c": 44.206, + "max_fan_rpm": 2507.0 + }, + { + "t": 79.26, + "available_gib": 18.951, + "max_temp_c": 43.75, + "max_fan_rpm": 2494.0 + }, + { + "t": 80.27, + "available_gib": 18.948, + "max_temp_c": 44.456, + "max_fan_rpm": 2503.0 + }, + { + "t": 81.29, + "available_gib": 18.954, + "max_temp_c": 43.788, + "max_fan_rpm": 2515.0 + }, + { + "t": 82.31, + "available_gib": 18.954, + "max_temp_c": 43.451, + "max_fan_rpm": 2494.0 + }, + { + "t": 83.33, + "available_gib": 18.954, + "max_temp_c": 43.5, + "max_fan_rpm": 2494.0 + }, + { + "t": 84.35, + "available_gib": 18.951, + "max_temp_c": 43.364, + "max_fan_rpm": 2511.0 + }, + { + "t": 85.36, + "available_gib": 18.95, + "max_temp_c": 43.711, + "max_fan_rpm": 2511.0 + }, + { + "t": 86.38, + "available_gib": 18.944, + "max_temp_c": 44.168, + "max_fan_rpm": 2512.0 + }, + { + "t": 87.4, + "available_gib": 18.962, + "max_temp_c": 42.673, + "max_fan_rpm": 2490.0 + }, + { + "t": 88.42, + "available_gib": 18.961, + "max_temp_c": 43.152, + "max_fan_rpm": 2482.0 + }, + { + "t": 89.44, + "available_gib": 18.96, + "max_temp_c": 43.239, + "max_fan_rpm": 2515.0 + }, + { + "t": 90.46, + "available_gib": 18.94, + "max_temp_c": 44.206, + "max_fan_rpm": 2494.0 + }, + { + "t": 91.48, + "available_gib": 18.938, + "max_temp_c": 43.413, + "max_fan_rpm": 2494.0 + }, + { + "t": 92.5, + "available_gib": 18.921, + "max_temp_c": 43.494, + "max_fan_rpm": 2494.0 + }, + { + "t": 93.51, + "available_gib": 18.921, + "max_temp_c": 44.315, + "max_fan_rpm": 2503.0 + }, + { + "t": 94.52, + "available_gib": 18.924, + "max_temp_c": 43.581, + "max_fan_rpm": 2503.0 + }, + { + "t": 95.53, + "available_gib": 18.924, + "max_temp_c": 43.152, + "max_fan_rpm": 2502.0 + }, + { + "t": 96.55, + "available_gib": 18.924, + "max_temp_c": 43.239, + "max_fan_rpm": 2507.0 + }, + { + "t": 97.56, + "available_gib": 18.926, + "max_temp_c": 43.282, + "max_fan_rpm": 2494.0 + }, + { + "t": 98.58, + "available_gib": 18.928, + "max_temp_c": 44.152, + "max_fan_rpm": 2507.0 + }, + { + "t": 99.6, + "available_gib": 18.93, + "max_temp_c": 43.326, + "max_fan_rpm": 2507.0 + }, + { + "t": 100.61, + "available_gib": 18.928, + "max_temp_c": 43.239, + "max_fan_rpm": 2481.0 + }, + { + "t": 101.63, + "available_gib": 18.93, + "max_temp_c": 42.94, + "max_fan_rpm": 2486.0 + }, + { + "t": 102.64, + "available_gib": 18.931, + "max_temp_c": 43.701, + "max_fan_rpm": 2507.0 + }, + { + "t": 103.66, + "available_gib": 18.933, + "max_temp_c": 43.581, + "max_fan_rpm": 2507.0 + }, + { + "t": 104.69, + "available_gib": 18.935, + "max_temp_c": 44.081, + "max_fan_rpm": 2507.0 + }, + { + "t": 105.7, + "available_gib": 18.94, + "max_temp_c": 43.364, + "max_fan_rpm": 2495.0 + }, + { + "t": 106.71, + "available_gib": 18.941, + "max_temp_c": 43.619, + "max_fan_rpm": 2490.0 + }, + { + "t": 107.73, + "available_gib": 18.942, + "max_temp_c": 43.581, + "max_fan_rpm": 2507.0 + }, + { + "t": 108.75, + "available_gib": 18.943, + "max_temp_c": 43.021, + "max_fan_rpm": 2494.0 + }, + { + "t": 109.76, + "available_gib": 18.944, + "max_temp_c": 43.711, + "max_fan_rpm": 2465.0 + }, + { + "t": 110.78, + "available_gib": 18.931, + "max_temp_c": 43.282, + "max_fan_rpm": 2516.0 + }, + { + "t": 111.8, + "available_gib": 18.931, + "max_temp_c": 44.043, + "max_fan_rpm": 2507.0 + }, + { + "t": 112.81, + "available_gib": 18.942, + "max_temp_c": 43.826, + "max_fan_rpm": 2502.0 + }, + { + "t": 113.82, + "available_gib": 18.947, + "max_temp_c": 43.701, + "max_fan_rpm": 2494.0 + }, + { + "t": 114.84, + "available_gib": 18.951, + "max_temp_c": 43.282, + "max_fan_rpm": 2503.0 + }, + { + "t": 115.86, + "available_gib": 18.95, + "max_temp_c": 43.663, + "max_fan_rpm": 2494.0 + }, + { + "t": 116.87, + "available_gib": 18.95, + "max_temp_c": 43.239, + "max_fan_rpm": 2511.0 + }, + { + "t": 117.89, + "available_gib": 18.95, + "max_temp_c": 43.619, + "max_fan_rpm": 2511.0 + }, + { + "t": 118.9, + "available_gib": 18.949, + "max_temp_c": 43.195, + "max_fan_rpm": 2494.0 + }, + { + "t": 119.91, + "available_gib": 18.943, + "max_temp_c": 43.532, + "max_fan_rpm": 2503.0 + }, + { + "t": 120.93, + "available_gib": 18.945, + "max_temp_c": 43.614, + "max_fan_rpm": 2494.0 + }, + { + "t": 121.95, + "available_gib": 18.95, + "max_temp_c": 43.668, + "max_fan_rpm": 2490.0 + }, + { + "t": 122.96, + "available_gib": 18.953, + "max_temp_c": 44.206, + "max_fan_rpm": 2499.0 + }, + { + "t": 123.97, + "available_gib": 18.953, + "max_temp_c": 43.413, + "max_fan_rpm": 2512.0 + }, + { + "t": 124.99, + "available_gib": 18.949, + "max_temp_c": 43.75, + "max_fan_rpm": 2490.0 + }, + { + "t": 126.01, + "available_gib": 18.948, + "max_temp_c": 43.826, + "max_fan_rpm": 2512.0 + }, + { + "t": 127.03, + "available_gib": 18.952, + "max_temp_c": 43.021, + "max_fan_rpm": 2511.0 + }, + { + "t": 128.05, + "available_gib": 18.946, + "max_temp_c": 43.282, + "max_fan_rpm": 2486.0 + }, + { + "t": 129.07, + "available_gib": 18.944, + "max_temp_c": 43.152, + "max_fan_rpm": 2494.0 + }, + { + "t": 130.09, + "available_gib": 18.935, + "max_temp_c": 43.282, + "max_fan_rpm": 2507.0 + }, + { + "t": 131.1, + "available_gib": 18.935, + "max_temp_c": 42.646, + "max_fan_rpm": 2507.0 + }, + { + "t": 132.11, + "available_gib": 18.935, + "max_temp_c": 43.364, + "max_fan_rpm": 2515.0 + }, + { + "t": 133.12, + "available_gib": 18.935, + "max_temp_c": 43.195, + "max_fan_rpm": 2464.0 + }, + { + "t": 134.14, + "available_gib": 18.936, + "max_temp_c": 43.407, + "max_fan_rpm": 2511.0 + }, + { + "t": 135.15, + "available_gib": 18.935, + "max_temp_c": 43.413, + "max_fan_rpm": 2494.0 + }, + { + "t": 136.16, + "available_gib": 18.934, + "max_temp_c": 42.983, + "max_fan_rpm": 2503.0 + }, + { + "t": 137.18, + "available_gib": 18.934, + "max_temp_c": 43.407, + "max_fan_rpm": 2494.0 + }, + { + "t": 138.2, + "available_gib": 18.935, + "max_temp_c": 43.451, + "max_fan_rpm": 2503.0 + }, + { + "t": 139.22, + "available_gib": 18.932, + "max_temp_c": 43.494, + "max_fan_rpm": 2507.0 + }, + { + "t": 140.23, + "available_gib": 18.935, + "max_temp_c": 42.766, + "max_fan_rpm": 2507.0 + }, + { + "t": 141.25, + "available_gib": 18.94, + "max_temp_c": 42.505, + "max_fan_rpm": 2512.0 + }, + { + "t": 142.26, + "available_gib": 18.94, + "max_temp_c": 43.576, + "max_fan_rpm": 2508.0 + }, + { + "t": 143.28, + "available_gib": 18.938, + "max_temp_c": 43.494, + "max_fan_rpm": 2490.0 + }, + { + "t": 144.3, + "available_gib": 18.942, + "max_temp_c": 42.94, + "max_fan_rpm": 2494.0 + }, + { + "t": 145.3, + "available_gib": 18.942, + "max_temp_c": 43.021, + "max_fan_rpm": 2507.0 + }, + { + "t": 146.33, + "available_gib": 18.954, + "max_temp_c": 43.195, + "max_fan_rpm": 2494.0 + }, + { + "t": 147.34, + "available_gib": 18.948, + "max_temp_c": 43.494, + "max_fan_rpm": 2486.0 + }, + { + "t": 148.35, + "available_gib": 18.954, + "max_temp_c": 43.326, + "max_fan_rpm": 2507.0 + }, + { + "t": 149.37, + "available_gib": 18.953, + "max_temp_c": 42.586, + "max_fan_rpm": 2507.0 + }, + { + "t": 150.38, + "available_gib": 18.94, + "max_temp_c": 42.456, + "max_fan_rpm": 2511.0 + }, + { + "t": 151.4, + "available_gib": 18.941, + "max_temp_c": 43.711, + "max_fan_rpm": 2515.0 + }, + { + "t": 152.41, + "available_gib": 18.962, + "max_temp_c": 42.809, + "max_fan_rpm": 2495.0 + }, + { + "t": 153.43, + "available_gib": 18.965, + "max_temp_c": 43.326, + "max_fan_rpm": 2507.0 + }, + { + "t": 154.45, + "available_gib": 18.965, + "max_temp_c": 44.695, + "max_fan_rpm": 2503.0 + }, + { + "t": 155.46, + "available_gib": 18.917, + "max_temp_c": 43.239, + "max_fan_rpm": 2516.0 + }, + { + "t": 156.48, + "available_gib": 18.863, + "max_temp_c": 42.934, + "max_fan_rpm": 2507.0 + }, + { + "t": 157.49, + "available_gib": 18.863, + "max_temp_c": 43.239, + "max_fan_rpm": 2490.0 + }, + { + "t": 158.51, + "available_gib": 18.871, + "max_temp_c": 43.494, + "max_fan_rpm": 2507.0 + }, + { + "t": 159.52, + "available_gib": 18.889, + "max_temp_c": 42.684, + "max_fan_rpm": 2507.0 + }, + { + "t": 160.54, + "available_gib": 18.892, + "max_temp_c": 42.896, + "max_fan_rpm": 2486.0 + }, + { + "t": 161.55, + "available_gib": 18.804, + "max_temp_c": 42.94, + "max_fan_rpm": 2507.0 + }, + { + "t": 162.59, + "available_gib": 18.633, + "max_temp_c": 43.114, + "max_fan_rpm": 2516.0 + }, + { + "t": 163.61, + "available_gib": 18.544, + "max_temp_c": 43.739, + "max_fan_rpm": 2507.0 + }, + { + "t": 164.63, + "available_gib": 18.283, + "max_temp_c": 43.364, + "max_fan_rpm": 2490.0 + }, + { + "t": 165.64, + "available_gib": 18.272, + "max_temp_c": 43.364, + "max_fan_rpm": 2507.0 + }, + { + "t": 166.66, + "available_gib": 18.272, + "max_temp_c": 43.195, + "max_fan_rpm": 2511.0 + }, + { + "t": 167.67, + "available_gib": 18.269, + "max_temp_c": 43.494, + "max_fan_rpm": 2511.0 + }, + { + "t": 168.69, + "available_gib": 18.295, + "max_temp_c": 43.826, + "max_fan_rpm": 2503.0 + }, + { + "t": 169.71, + "available_gib": 18.299, + "max_temp_c": 43.326, + "max_fan_rpm": 2503.0 + }, + { + "t": 170.72, + "available_gib": 18.307, + "max_temp_c": 42.934, + "max_fan_rpm": 2515.0 + }, + { + "t": 171.73, + "available_gib": 18.304, + "max_temp_c": 43.826, + "max_fan_rpm": 2465.0 + }, + { + "t": 172.77, + "available_gib": 18.31, + "max_temp_c": 43.581, + "max_fan_rpm": 2507.0 + }, + { + "t": 173.8, + "available_gib": 18.313, + "max_temp_c": 42.934, + "max_fan_rpm": 2507.0 + }, + { + "t": 174.81, + "available_gib": 18.426, + "max_temp_c": 43.326, + "max_fan_rpm": 2511.0 + }, + { + "t": 175.84, + "available_gib": 18.393, + "max_temp_c": 43.114, + "max_fan_rpm": 2485.0 + }, + { + "t": 176.85, + "available_gib": 18.413, + "max_temp_c": 43.494, + "max_fan_rpm": 2502.0 + }, + { + "t": 177.86, + "available_gib": 18.421, + "max_temp_c": 43.657, + "max_fan_rpm": 2494.0 + }, + { + "t": 178.88, + "available_gib": 18.433, + "max_temp_c": 43.701, + "max_fan_rpm": 2511.0 + }, + { + "t": 179.9, + "available_gib": 18.18, + "max_temp_c": 42.38, + "max_fan_rpm": 2494.0 + }, + { + "t": 180.91, + "available_gib": 18.199, + "max_temp_c": 43.913, + "max_fan_rpm": 2516.0 + }, + { + "t": 181.93, + "available_gib": 18.293, + "max_temp_c": 43.114, + "max_fan_rpm": 2506.0 + }, + { + "t": 182.95, + "available_gib": 18.271, + "max_temp_c": 43.668, + "max_fan_rpm": 2494.0 + }, + { + "t": 183.96, + "available_gib": 18.169, + "max_temp_c": 43.065, + "max_fan_rpm": 2506.0 + }, + { + "t": 185.0, + "available_gib": 18.182, + "max_temp_c": 43.826, + "max_fan_rpm": 2515.0 + }, + { + "t": 186.02, + "available_gib": 18.156, + "max_temp_c": 43.195, + "max_fan_rpm": 2507.0 + } + ], + "log_tail": "[tensorfold] prompt chunks of up to 32 tokens, cut at replies 256+ tokens apart\nwarning: libtfgrammar.so is required for structured output and required tool calls (HTTP 400 when missing); restore the matching release archive's lib/ directory or run zig build grammar -Dxgrammar=DIR; prepare DIR with git clone --branch v0.2.8 --recurse-submodules https://github.com/mlc-ai/xgrammar\n[tensorfold] serving qwen35-2b at http://127.0.0.1:49607/v1 (sampling: greedy; drafts: none; context: 1024; loaded in 0.5s)\n[tensorfold] 127.0.0.1 \"GET /health HTTP/1.1\" 200 -\n[tensorfold] 127.0.0.1 \"GET /v1/models HTTP/1.1\" 200 -\n[tensorfold] 127.0.0.1 \"POST /v1/chat/completions HTTP/1.1\" 200 -\n[tensorfold] done chatcmpl-f5667604561f6a2f5118855098a615f7 prompt=41 cached=0 thinking=False effort=none tokens=256 sha=f87626954a51 finish=length rounds=255 accepted=0/0 ttft=2.889 decode=88.531 elapsed=91.420 queued=0.000 tok/s=2.9\n[tensorfold] 127.0.0.1 \"POST /v1/chat/completions HTTP/1.1\" 200 -\n[tensorfold] done chatcmpl-43886b32cdfd074c46353c04a941c7fc prompt=41 cached=0 thinking=False effort=none tokens=256 sha=f87626954a51 finish=length rounds=255 accepted=0/0 ttft=2.963 decode=91.510 elapsed=94.473 queued=0.000 tok/s=2.8\n[tensorfold] shutting down (SIGTERM): draining: new requests get 503; 0 request(s) in progress may finish within 20.0 s\n[tensorfold] shutting down: drained\n[tensorfold] shutting down: stopped\n", + "ready_s": 91.938330168, + "ttft_s": 2.9680891790003443, + "total_s": 94.47694070000034, + "completion_tokens": 256, + "token_count_source": "usage", + "text": "A rainbow is a spectacular natural phenomenon that occurs when sunlight interacts with water droplets in the atmosphere, creating a spectrum of colors that we see in the sky. This optical effect is a complex interplay of physics involving refraction, reflection, dispersion, and the viewing angle. To understand how a rainbow forms, one must first consider the properties of light and the behavior of water droplets.\n\nThe process begins with the entry of sunlight into a water droplet. Sunlight is composed of all visible wavelengths of the electromagnetic spectrum, ranging from red to violet. As these rays enter the droplet, they encounter a medium with a higher refractive index than air. Consequently, the light slows down and bends, a process known as refraction. Because different wavelengths of light travel at different speeds, they refract at slightly different angles. This phenomenon is called dispersion. Violet light, having the shortest wavelength, bends the most, while red light, with the longest wavelength, bends the least.\n\nUpon entering the droplet, the light ray undergoes a second refraction as it exits the back of the droplet. However, the path of the light ray is not a straight line; it curves inward as it travels through the droplet. This curvature is crucial because it sets", + "served_model": "qwen35-2b", + "text_sha256": "83887b098d88ea16a47c6d0aad022a58cf6a9ee6565c6b33e5633a90ff4a80d5", + "decode_tps": 2.7866156744572526, + "min_available_gib": 18.156, + "peak_temp_c": 44.994, + "round": 1, + "admission_available_gib": 20.109 + } + ], + "summary": { + "mlx-120k": { + "ok_runs": 1, + "median_ttft_s": 0.49659852400009186, + "median_total_s": 5.034850170000027, + "median_decode_tps": 56.189039280084835, + "texts": [ + "3f3ac70c5d72" + ] + }, + "tensorfold": { + "ok_runs": 1, + "median_ttft_s": 2.9680891790003443, + "median_total_s": 94.47694070000034, + "median_decode_tps": 2.7866156744572526, + "texts": [ + "83887b098d88" + ] + } + } +} diff --git a/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/compare-short.json b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/compare-short.json new file mode 100644 index 00000000..37a329c9 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/compare-short.json @@ -0,0 +1,724 @@ +{ + "status": "complete", + "model_key": "qwen2b", + "model": "mlx-community/Qwen3.5-2B-MLX-4bit@93760be4f1f69842a46bc13dbdc0f19e291392a3", + "weights_sha256": "713fe7e5d3c3965f7106b0d0ee17615f7869c23c8d327996df8c1196fbcf07d5", + "kernel": "7.2.11-elementary-aurora72-wip5", + "driver": "Honeykrisp Mesa 9323171c12", + "tensorfold_rev": "b3ab9ba217a80c63fcc48f7643ddfe339a8f4bdc", + "rapid_rev": "1d09cdb684bbf58fac130f5804b08ee2e1f56558", + "serve_concurrency": 4, + "prompt_sha256": "af125b15dfba55caedb541e89e59fe1252c0f13553e5ce6bc181e237fada9926", + "max_tokens": 32, + "policy": { + "reserve_gib": 6, + "max_fan_rpm": null, + "max_temp_c": 80 + }, + "allowance_gib": 4.5, + "arms": [ + "mlx-120k", + "tensorfold" + ], + "concurrency": 1, + "runs": [ + { + "arm": "mlx-120k", + "stopped": null, + "samples": [ + { + "t": 0.01, + "available_gib": 20.045, + "max_temp_c": 45.78, + "max_fan_rpm": 2488.0 + }, + { + "t": 1.01, + "available_gib": 19.327, + "max_temp_c": 45.9, + "max_fan_rpm": 2514.0 + }, + { + "t": 2.02, + "available_gib": 18.542, + "max_temp_c": 45.266, + "max_fan_rpm": 2501.0 + }, + { + "t": 3.03, + "available_gib": 18.546, + "max_temp_c": 44.961, + "max_fan_rpm": 2527.0 + }, + { + "t": 4.04, + "available_gib": 18.323, + "max_temp_c": 45.88, + "max_fan_rpm": 2505.0 + }, + { + "t": 5.05, + "available_gib": 19.027, + "max_temp_c": 45.026, + "max_fan_rpm": 2510.0 + } + ], + "log_tail": "", + "ready_s": 3.7107743550000123, + "ttft_s": 0.4291830970000774, + "total_s": 0.9963476309999351, + "completion_tokens": 32, + "text": "Sunlight travels through the atmosphere and gets refracted (bent) as it enters a raindrop.\nThe light then reflects off the back of the dro", + "text_sha256": "ffbf23cb27bb50106bf151750276ab30f61683b0bec1ceb077bab1d61844393e", + "decode_tps": 54.65786053541878, + "min_available_gib": 18.323, + "peak_temp_c": 45.9, + "round": 1, + "admission_available_gib": 20.045 + }, + { + "arm": "tensorfold", + "stopped": null, + "samples": [ + { + "t": 0.01, + "available_gib": 20.018, + "max_temp_c": 45.346, + "max_fan_rpm": 2505.0 + }, + { + "t": 1.03, + "available_gib": 18.715, + "max_temp_c": 45.306, + "max_fan_rpm": 2500.0 + }, + { + "t": 2.05, + "available_gib": 18.667, + "max_temp_c": 45.386, + "max_fan_rpm": 2496.0 + }, + { + "t": 3.06, + "available_gib": 18.659, + "max_temp_c": 46.5, + "max_fan_rpm": 2501.0 + }, + { + "t": 4.07, + "available_gib": 18.663, + "max_temp_c": 45.846, + "max_fan_rpm": 2505.0 + }, + { + "t": 5.08, + "available_gib": 18.684, + "max_temp_c": 45.306, + "max_fan_rpm": 2506.0 + }, + { + "t": 6.1, + "available_gib": 18.684, + "max_temp_c": 45.386, + "max_fan_rpm": 2492.0 + }, + { + "t": 7.12, + "available_gib": 18.682, + "max_temp_c": 46.533, + "max_fan_rpm": 2501.0 + }, + { + "t": 8.13, + "available_gib": 18.683, + "max_temp_c": 46.033, + "max_fan_rpm": 2493.0 + }, + { + "t": 9.15, + "available_gib": 18.681, + "max_temp_c": 45.146, + "max_fan_rpm": 2505.0 + }, + { + "t": 10.17, + "available_gib": 18.682, + "max_temp_c": 44.864, + "max_fan_rpm": 2501.0 + }, + { + "t": 11.2, + "available_gib": 18.682, + "max_temp_c": 45.066, + "max_fan_rpm": 2514.0 + }, + { + "t": 12.21, + "available_gib": 18.68, + "max_temp_c": 45.913, + "max_fan_rpm": 2514.0 + }, + { + "t": 13.23, + "available_gib": 18.685, + "max_temp_c": 45.033, + "max_fan_rpm": 2505.0 + }, + { + "t": 14.24, + "available_gib": 18.679, + "max_temp_c": 44.369, + "max_fan_rpm": 2514.0 + }, + { + "t": 15.26, + "available_gib": 18.666, + "max_temp_c": 45.813, + "max_fan_rpm": 2501.0 + }, + { + "t": 16.27, + "available_gib": 18.672, + "max_temp_c": 46.84, + "max_fan_rpm": 2506.0 + }, + { + "t": 17.29, + "available_gib": 18.673, + "max_temp_c": 45.693, + "max_fan_rpm": 2502.0 + }, + { + "t": 18.3, + "available_gib": 18.672, + "max_temp_c": 45.146, + "max_fan_rpm": 2488.0 + }, + { + "t": 19.31, + "available_gib": 18.697, + "max_temp_c": 44.5, + "max_fan_rpm": 2514.0 + }, + { + "t": 20.33, + "available_gib": 18.696, + "max_temp_c": 44.369, + "max_fan_rpm": 2489.0 + }, + { + "t": 21.35, + "available_gib": 18.697, + "max_temp_c": 44.668, + "max_fan_rpm": 2510.0 + }, + { + "t": 22.37, + "available_gib": 18.696, + "max_temp_c": 44.896, + "max_fan_rpm": 2489.0 + }, + { + "t": 23.38, + "available_gib": 18.684, + "max_temp_c": 44.896, + "max_fan_rpm": 2497.0 + }, + { + "t": 24.4, + "available_gib": 18.68, + "max_temp_c": 45.106, + "max_fan_rpm": 2506.0 + }, + { + "t": 25.43, + "available_gib": 18.678, + "max_temp_c": 45.186, + "max_fan_rpm": 2476.0 + } + ], + "log_tail": "[tensorfold] prompt chunks of up to 32 tokens, cut at replies 256+ tokens apart\nwarning: libtfgrammar.so is required for structured output and required tool calls (HTTP 400 when missing); restore the matching release archive's lib/ directory or run zig build grammar -Dxgrammar=DIR; prepare DIR with git clone --branch v0.2.8 --recurse-submodules https://github.com/mlc-ai/xgrammar\n[tensorfold] serving qwen35-2b at http://127.0.0.1:35227/v1 (sampling: greedy; drafts: none; context: 1024; loaded in 0.5s)\n[tensorfold] 127.0.0.1 \"GET /health HTTP/1.1\" 200 -\n[tensorfold] 127.0.0.1 \"GET /v1/models HTTP/1.1\" 200 -\n[tensorfold] 127.0.0.1 \"POST /v1/chat/completions HTTP/1.1\" 200 -\n[tensorfold] done chatcmpl-fc4120dc2458447e16b1c6c1e3c78e41 prompt=27 cached=0 thinking=False effort=none tokens=32 sha=778f678f6c4f finish=length rounds=31 accepted=0/0 ttft=1.947 decode=10.983 elapsed=12.929 queued=0.000 tok/s=2.8\n[tensorfold] 127.0.0.1 \"POST /v1/chat/completions HTTP/1.1\" 200 -\n[tensorfold] done chatcmpl-d140d0c520458a24a6206fbe2b6e99ef prompt=27 cached=0 thinking=False effort=none tokens=32 sha=778f678f6c4f finish=length rounds=31 accepted=0/0 ttft=1.904 decode=10.732 elapsed=12.636 queued=0.000 tok/s=2.9\n[tensorfold] shutting down (SIGTERM): draining: new requests get 503; 0 request(s) in progress may finish within 20.0 s\n[tensorfold] shutting down: drained\n[tensorfold] shutting down: stopped\n", + "ready_s": 13.443838389999655, + "ttft_s": 1.905656092999834, + "total_s": 12.638289590000113, + "completion_tokens": 32, + "token_count_source": "usage", + "text": "Sunlight travels through the atmosphere and gets refracted (bent) as it enters a raindrop.\nThe light then reflects off the back of the dro", + "served_model": "qwen35-2b", + "text_sha256": "ffbf23cb27bb50106bf151750276ab30f61683b0bec1ceb077bab1d61844393e", + "decode_tps": 2.8883870867913597, + "min_available_gib": 18.659, + "peak_temp_c": 46.84, + "round": 1, + "admission_available_gib": 20.015 + }, + { + "arm": "tensorfold", + "stopped": null, + "samples": [ + { + "t": 0.02, + "available_gib": 20.003, + "max_temp_c": 44.57, + "max_fan_rpm": 2501.0 + }, + { + "t": 1.03, + "available_gib": 18.704, + "max_temp_c": 45.146, + "max_fan_rpm": 2506.0 + }, + { + "t": 2.05, + "available_gib": 18.704, + "max_temp_c": 45.26, + "max_fan_rpm": 2514.0 + }, + { + "t": 3.06, + "available_gib": 18.696, + "max_temp_c": 45.346, + "max_fan_rpm": 2502.0 + }, + { + "t": 4.07, + "available_gib": 18.703, + "max_temp_c": 44.733, + "max_fan_rpm": 2493.0 + }, + { + "t": 5.09, + "available_gib": 18.703, + "max_temp_c": 45.5, + "max_fan_rpm": 2497.0 + }, + { + "t": 6.1, + "available_gib": 18.71, + "max_temp_c": 45.186, + "max_fan_rpm": 2506.0 + }, + { + "t": 7.12, + "available_gib": 18.712, + "max_temp_c": 44.771, + "max_fan_rpm": 2489.0 + }, + { + "t": 8.13, + "available_gib": 18.715, + "max_temp_c": 45.533, + "max_fan_rpm": 2490.0 + }, + { + "t": 9.15, + "available_gib": 18.718, + "max_temp_c": 44.478, + "max_fan_rpm": 2506.0 + }, + { + "t": 10.16, + "available_gib": 18.719, + "max_temp_c": 44.478, + "max_fan_rpm": 2514.0 + }, + { + "t": 11.18, + "available_gib": 18.725, + "max_temp_c": 44.478, + "max_fan_rpm": 2489.0 + }, + { + "t": 12.19, + "available_gib": 18.725, + "max_temp_c": 45.066, + "max_fan_rpm": 2515.0 + }, + { + "t": 13.21, + "available_gib": 18.715, + "max_temp_c": 44.961, + "max_fan_rpm": 2519.0 + }, + { + "t": 14.22, + "available_gib": 18.71, + "max_temp_c": 44.831, + "max_fan_rpm": 2502.0 + }, + { + "t": 15.24, + "available_gib": 18.709, + "max_temp_c": 44.146, + "max_fan_rpm": 2468.0 + }, + { + "t": 16.26, + "available_gib": 18.727, + "max_temp_c": 45.26, + "max_fan_rpm": 2510.0 + }, + { + "t": 17.28, + "available_gib": 18.731, + "max_temp_c": 44.701, + "max_fan_rpm": 2515.0 + }, + { + "t": 18.3, + "available_gib": 18.732, + "max_temp_c": 45.106, + "max_fan_rpm": 2488.0 + }, + { + "t": 19.31, + "available_gib": 18.737, + "max_temp_c": 44.896, + "max_fan_rpm": 2506.0 + }, + { + "t": 20.33, + "available_gib": 18.745, + "max_temp_c": 44.222, + "max_fan_rpm": 2514.0 + }, + { + "t": 21.34, + "available_gib": 18.748, + "max_temp_c": 44.445, + "max_fan_rpm": 2505.0 + }, + { + "t": 22.36, + "available_gib": 18.75, + "max_temp_c": 45.066, + "max_fan_rpm": 2505.0 + }, + { + "t": 23.37, + "available_gib": 18.754, + "max_temp_c": 45.033, + "max_fan_rpm": 2488.0 + }, + { + "t": 24.39, + "available_gib": 18.757, + "max_temp_c": 44.57, + "max_fan_rpm": 2510.0 + }, + { + "t": 25.4, + "available_gib": 18.751, + "max_temp_c": 44.864, + "max_fan_rpm": 2502.0 + } + ], + "log_tail": "[tensorfold] prompt chunks of up to 32 tokens, cut at replies 256+ tokens apart\nwarning: libtfgrammar.so is required for structured output and required tool calls (HTTP 400 when missing); restore the matching release archive's lib/ directory or run zig build grammar -Dxgrammar=DIR; prepare DIR with git clone --branch v0.2.8 --recurse-submodules https://github.com/mlc-ai/xgrammar\n[tensorfold] serving qwen35-2b at http://127.0.0.1:50751/v1 (sampling: greedy; drafts: none; context: 1024; loaded in 0.5s)\n[tensorfold] 127.0.0.1 \"GET /health HTTP/1.1\" 200 -\n[tensorfold] 127.0.0.1 \"GET /v1/models HTTP/1.1\" 200 -\n[tensorfold] 127.0.0.1 \"POST /v1/chat/completions HTTP/1.1\" 200 -\n[tensorfold] done chatcmpl-3cec2f8ac4436799d0a6aab9d61b5259 prompt=27 cached=0 thinking=False effort=none tokens=32 sha=778f678f6c4f finish=length rounds=31 accepted=0/0 ttft=1.906 decode=11.174 elapsed=13.081 queued=0.000 tok/s=2.8\n[tensorfold] 127.0.0.1 \"POST /v1/chat/completions HTTP/1.1\" 200 -\n[tensorfold] done chatcmpl-00fbdfaf0d99fe05c37c3ead826c5eec prompt=27 cached=0 thinking=False effort=none tokens=32 sha=778f678f6c4f finish=length rounds=31 accepted=0/0 ttft=1.953 decode=10.791 elapsed=12.744 queued=0.000 tok/s=2.9\n[tensorfold] shutting down (SIGTERM): draining: new requests get 503; 0 request(s) in progress may finish within 20.0 s\n[tensorfold] shutting down: drained\n[tensorfold] shutting down: stopped\n", + "ready_s": 13.598392987000352, + "ttft_s": 1.954549820000011, + "total_s": 12.745835666999938, + "completion_tokens": 32, + "token_count_source": "usage", + "text": "Sunlight travels through the atmosphere and gets refracted (bent) as it enters a raindrop.\nThe light then reflects off the back of the dro", + "served_model": "qwen35-2b", + "text_sha256": "ffbf23cb27bb50106bf151750276ab30f61683b0bec1ceb077bab1d61844393e", + "decode_tps": 2.872688244896995, + "min_available_gib": 18.696, + "peak_temp_c": 45.533, + "round": 2, + "admission_available_gib": 20.004 + }, + { + "arm": "mlx-120k", + "stopped": null, + "samples": [ + { + "t": 0.02, + "available_gib": 20.014, + "max_temp_c": 44.353, + "max_fan_rpm": 2489.0 + }, + { + "t": 1.03, + "available_gib": 18.935, + "max_temp_c": 44.478, + "max_fan_rpm": 2501.0 + }, + { + "t": 2.03, + "available_gib": 18.568, + "max_temp_c": 44.407, + "max_fan_rpm": 2476.0 + }, + { + "t": 3.04, + "available_gib": 18.368, + "max_temp_c": 44.222, + "max_fan_rpm": 2506.0 + }, + { + "t": 4.06, + "available_gib": 18.319, + "max_temp_c": 44.445, + "max_fan_rpm": 2489.0 + } + ], + "log_tail": "", + "ready_s": 3.552564177000022, + "ttft_s": 0.4204296009997961, + "total_s": 0.9912184659997365, + "completion_tokens": 32, + "text": "Sunlight travels through the atmosphere and gets refracted (bent) as it enters a raindrop.\nThe light then reflects off the back of the dro", + "text_sha256": "ffbf23cb27bb50106bf151750276ab30f61683b0bec1ceb077bab1d61844393e", + "decode_tps": 54.3108001940494, + "min_available_gib": 18.319, + "peak_temp_c": 44.478, + "round": 2, + "admission_available_gib": 20.015 + }, + { + "arm": "mlx-120k", + "stopped": null, + "samples": [ + { + "t": 0.01, + "available_gib": 19.983, + "max_temp_c": 44.445, + "max_fan_rpm": 2510.0 + }, + { + "t": 1.02, + "available_gib": 18.9, + "max_temp_c": 45.146, + "max_fan_rpm": 2515.0 + }, + { + "t": 2.04, + "available_gib": 18.54, + "max_temp_c": 44.961, + "max_fan_rpm": 2506.0 + }, + { + "t": 3.05, + "available_gib": 18.285, + "max_temp_c": 44.548, + "max_fan_rpm": 2502.0 + }, + { + "t": 4.07, + "available_gib": 18.205, + "max_temp_c": 45.926, + "max_fan_rpm": 2510.0 + } + ], + "log_tail": "", + "ready_s": 3.547021262999806, + "ttft_s": 0.42343893199995364, + "total_s": 0.9921264240001619, + "completion_tokens": 32, + "text": "Sunlight travels through the atmosphere and gets refracted (bent) as it enters a raindrop.\nThe light then reflects off the back of the dro", + "text_sha256": "ffbf23cb27bb50106bf151750276ab30f61683b0bec1ceb077bab1d61844393e", + "decode_tps": 54.511485545366355, + "min_available_gib": 18.205, + "peak_temp_c": 45.926, + "round": 3, + "admission_available_gib": 19.982 + }, + { + "arm": "tensorfold", + "stopped": null, + "samples": [ + { + "t": 0.02, + "available_gib": 19.812, + "max_temp_c": 43.586, + "max_fan_rpm": 2510.0 + }, + { + "t": 1.05, + "available_gib": 18.513, + "max_temp_c": 44.407, + "max_fan_rpm": 2506.0 + }, + { + "t": 2.06, + "available_gib": 18.53, + "max_temp_c": 44.548, + "max_fan_rpm": 2489.0 + }, + { + "t": 3.08, + "available_gib": 18.538, + "max_temp_c": 44.353, + "max_fan_rpm": 2489.0 + }, + { + "t": 4.09, + "available_gib": 18.537, + "max_temp_c": 44.608, + "max_fan_rpm": 2506.0 + }, + { + "t": 5.11, + "available_gib": 18.559, + "max_temp_c": 44.994, + "max_fan_rpm": 2502.0 + }, + { + "t": 6.12, + "available_gib": 18.567, + "max_temp_c": 44.994, + "max_fan_rpm": 2515.0 + }, + { + "t": 7.14, + "available_gib": 18.567, + "max_temp_c": 44.608, + "max_fan_rpm": 2494.0 + }, + { + "t": 8.16, + "available_gib": 18.574, + "max_temp_c": 44.869, + "max_fan_rpm": 2489.0 + }, + { + "t": 9.18, + "available_gib": 18.581, + "max_temp_c": 43.63, + "max_fan_rpm": 2493.0 + }, + { + "t": 10.19, + "available_gib": 18.564, + "max_temp_c": 45.066, + "max_fan_rpm": 2511.0 + }, + { + "t": 11.2, + "available_gib": 18.571, + "max_temp_c": 44.054, + "max_fan_rpm": 2502.0 + }, + { + "t": 12.22, + "available_gib": 18.588, + "max_temp_c": 44.516, + "max_fan_rpm": 2502.0 + }, + { + "t": 13.24, + "available_gib": 18.605, + "max_temp_c": 44.385, + "max_fan_rpm": 2502.0 + }, + { + "t": 14.25, + "available_gib": 18.598, + "max_temp_c": 44.608, + "max_fan_rpm": 2502.0 + }, + { + "t": 15.27, + "available_gib": 18.601, + "max_temp_c": 45.146, + "max_fan_rpm": 2502.0 + }, + { + "t": 16.3, + "available_gib": 18.619, + "max_temp_c": 44.57, + "max_fan_rpm": 2493.0 + }, + { + "t": 17.31, + "available_gib": 18.677, + "max_temp_c": 44.054, + "max_fan_rpm": 2511.0 + }, + { + "t": 18.33, + "available_gib": 18.687, + "max_temp_c": 44.804, + "max_fan_rpm": 2502.0 + }, + { + "t": 19.35, + "available_gib": 18.699, + "max_temp_c": 44.711, + "max_fan_rpm": 2489.0 + }, + { + "t": 20.36, + "available_gib": 18.72, + "max_temp_c": 44.673, + "max_fan_rpm": 2510.0 + }, + { + "t": 21.38, + "available_gib": 18.749, + "max_temp_c": 44.26, + "max_fan_rpm": 2468.0 + }, + { + "t": 22.39, + "available_gib": 18.763, + "max_temp_c": 44.423, + "max_fan_rpm": 2511.0 + }, + { + "t": 23.4, + "available_gib": 18.783, + "max_temp_c": 44.608, + "max_fan_rpm": 2493.0 + }, + { + "t": 24.41, + "available_gib": 18.8, + "max_temp_c": 44.222, + "max_fan_rpm": 2506.0 + }, + { + "t": 25.43, + "available_gib": 18.815, + "max_temp_c": 44.26, + "max_fan_rpm": 2510.0 + } + ], + "log_tail": "[tensorfold] prompt chunks of up to 32 tokens, cut at replies 256+ tokens apart\nwarning: libtfgrammar.so is required for structured output and required tool calls (HTTP 400 when missing); restore the matching release archive's lib/ directory or run zig build grammar -Dxgrammar=DIR; prepare DIR with git clone --branch v0.2.8 --recurse-submodules https://github.com/mlc-ai/xgrammar\n[tensorfold] serving qwen35-2b at http://127.0.0.1:56219/v1 (sampling: greedy; drafts: none; context: 1024; loaded in 0.6s)\n[tensorfold] 127.0.0.1 \"GET /health HTTP/1.1\" 200 -\n[tensorfold] 127.0.0.1 \"GET /v1/models HTTP/1.1\" 200 -\n[tensorfold] 127.0.0.1 \"POST /v1/chat/completions HTTP/1.1\" 200 -\n[tensorfold] done chatcmpl-7224eaf83687aeae917bf83c7354df7b prompt=27 cached=0 thinking=False effort=none tokens=32 sha=778f678f6c4f finish=length rounds=31 accepted=0/0 ttft=1.934 decode=10.627 elapsed=12.561 queued=0.000 tok/s=2.9\n[tensorfold] 127.0.0.1 \"POST /v1/chat/completions HTTP/1.1\" 200 -\n[tensorfold] done chatcmpl-a9d9d8f7a7acda0c6843f9de8a3bd26c prompt=27 cached=0 thinking=False effort=none tokens=32 sha=778f678f6c4f finish=length rounds=31 accepted=0/0 ttft=1.912 decode=10.696 elapsed=12.608 queued=0.000 tok/s=2.9\n[tensorfold] shutting down (SIGTERM): draining: new requests get 503; 0 request(s) in progress may finish within 20.0 s\n[tensorfold] shutting down: drained\n[tensorfold] shutting down: stopped\n", + "ready_s": 13.56921120900006, + "ttft_s": 1.9138890049998736, + "total_s": 12.610726186000193, + "completion_tokens": 32, + "token_count_source": "usage", + "text": "Sunlight travels through the atmosphere and gets refracted (bent) as it enters a raindrop.\nThe light then reflects off the back of the dro", + "served_model": "qwen35-2b", + "text_sha256": "ffbf23cb27bb50106bf151750276ab30f61683b0bec1ceb077bab1d61844393e", + "decode_tps": 2.8980528987635785, + "min_available_gib": 18.513, + "peak_temp_c": 45.146, + "round": 3, + "admission_available_gib": 19.812 + } + ], + "summary": { + "mlx-120k": { + "ok_runs": 3, + "median_ttft_s": 0.42343893199995364, + "median_total_s": 0.9921264240001619, + "median_decode_tps": 54.511485545366355, + "texts": [ + "ffbf23cb27bb" + ] + }, + "tensorfold": { + "ok_runs": 3, + "median_ttft_s": 1.9138890049998736, + "median_total_s": 12.638289590000113, + "median_decode_tps": 2.8883870867913597, + "texts": [ + "ffbf23cb27bb" + ] + } + } +} diff --git a/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/contract.log b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/contract.log new file mode 100644 index 00000000..c9726325 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/contract.log @@ -0,0 +1,183 @@ +== qmm +LIMITS deviceName="Apple M1 Pro (G13S C0)" +LIMITS driverName="Honeykrisp" driverInfo="Mesa 26.3.0-devel (git-9323171c12)" subgroupSize=32 +LIMITS maxComputeWorkGroupInvocations=1024 maxComputeWorkGroupSize=1024,1024,64 maxComputeSharedMemorySize=32768 +LIMITS maxStorageBufferRange=2147483647 minStorageBufferOffsetAlignment=16 +PASS limits qmm_bf16: local=256x1x1 invocations=256 shared=0 +PASS limits control:qmm_fmax_nonfinite: local=256x1x1 invocations=256 shared=0 +PASS limits control:atomic_sum: local=256x1x1 invocations=256 shared=0 +PASS limits control:scribble_input: local=256x1x1 invocations=256 shared=0 +PASS limits control:drop_tail: local=256x1x1 invocations=256 shared=0 +PASS limits control:fp16_accum: local=256x1x1 invocations=256 shared=0 +PASS limits control:over_limit: local=2048x1x1 invocations=2048 shared=0 +PASS nonfinite vulkan qmm_bf16 affine q4 g64 transposed: 64 non-finite and 16 finite outputs match the float64 classes +PASS repeat vulkan qmm_bf16 affine q4 g64 transposed: five runs byte-identical (64 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan qmm_bf16 affine q4 g64 transposed: 15 shapes within the float64 bound (worst 0.990 of the bound), 0 edges refused by the kernel +PASS sums vulkan qmm_bf16 affine q4 g64 transposed: exact sums at k 6144, where fp16 sums would miss by 5268x and bf16 by 256x +FAIL nonfinite control: qmm fmax drops NaN: 1 of 5 outputs differ in class; first at 0: finite where float64 gives nan +CONTROL control: qmm fmax drops NaN: red at nonfinite, as planted +FAIL repeat control: atomic add row sum: 4 of 4 repeats differ from the first run's bytes, first at byte 4 +CONTROL control: atomic add row sum: red at repeat, as planted +FAIL repeat control: row sum scribbles input: 4 of 4 repeats differ from the first run's bytes, first at byte 0 +CONTROL control: row sum scribbles input: red at repeat, as planted +FAIL shapes control: row sum drops K tail: at 4x1x4097 output 0 is 8.023634e1 where float64 gives 8.094338e1: 224.57 of its bound +CONTROL control: row sum drops K tail: red at shapes, as planted +FAIL sums control: dot accumulates in fp16: infx over its exact-sum bound at k 4096: not fp32 sums (fp16 would miss 33554432x, bf16 16777216x) +CONTROL control: dot accumulates in fp16: red at sums, as planted +FAIL repeat control: qmm writes its weights: a run changed its inputs +CONTROL control: qmm writes its weights: red at repeat, as planted +FAIL repeat control: qmm writes its biases: a run changed its inputs +CONTROL control: qmm writes its biases: red at repeat, as planted +SUMMARY Apple M1 Pro (G13S C0) 1 kernels: 1 pass gates 1-4, 0 fail, 0 known findings; 8 controls: 8 caught, 0 missed; 0 limit failures; gates 13299 ms +CONTRACT qmm: PASS +== gdn +LIMITS deviceName="Apple M1 Pro (G13S C0)" +LIMITS driverName="Honeykrisp" driverInfo="Mesa 26.3.0-devel (git-9323171c12)" subgroupSize=32 shuffle-relative=true storage16=true int16=true +LIMITS maxComputeWorkGroupInvocations=1024 maxComputeWorkGroupSize=1024,1024,64 maxComputeSharedMemorySize=32768 +LIMITS maxStorageBufferRange=2147483647 minStorageBufferOffsetAlignment=16 +PASS limits qmm_bf16: local=256x1x1 invocations=256 shared=0 +PASS limits control:qmm_fmax_nonfinite: local=256x1x1 invocations=256 shared=0 +PASS limits control:atomic_sum: local=256x1x1 invocations=256 shared=0 +PASS limits control:scribble_input: local=256x1x1 invocations=256 shared=0 +PASS limits control:drop_tail: local=256x1x1 invocations=256 shared=0 +PASS limits control:fp16_accum: local=256x1x1 invocations=256 shared=0 +PASS limits control:over_limit: local=2048x1x1 invocations=2048 shared=0 +PASS limits gdn copy_u16: local=256x1x1 invocations=256 shared=0 +PASS limits gdn conv_dw1d_bf16: local=256x1x1 invocations=256 shared=1024 +PASS limits gdn gdn_conv_decode_bf16: local=256x1x1 invocations=256 shared=128 +PASS limits gdn gdn_split_bf16: local=32x1x1 invocations=32 shared=3072 +PASS limits gdn prefill_recur_bf16: local=128x1x1 invocations=128 shared=18048 +PASS limits gdn gated_delta_decode_bf16: local=128x1x1 invocations=128 shared=1024 +PASS limits gdn fast_norm_gated_bf16: local=256x1x1 invocations=256 shared=0 +PASS nonfinite vulkan gdn split soa+beta (bf16): 128 non-finite and 49152 finite outputs match the float64 classes +PASS repeat vulkan gdn split soa+beta (bf16): five runs byte-identical (98560 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan gdn split soa+beta (bf16): 5 shapes within the float64 bound (worst 0.037 of the bound), 0 edges refused by the kernel +PASS sums vulkan gdn split soa+beta (bf16): within its bound at k 128; fp16 sums would miss 0x, bf16 0.0x (the 32-lane square sum reaches the output only through its inverse square root, and the stated budget's magnitude term at the output's scale is wider than any fp16 miss the stress can engineer: gate 3's shapes bound the sum to f32 quality instead (a bf16-summed ss misses by ~2^-8 relative, far past the observed worst of bound)) +PASS nonfinite vulkan gdn split g (f32): 1 non-finite and 127 finite outputs match the float64 classes +PASS repeat vulkan gdn split g (f32): five runs byte-identical (512 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan gdn split g (f32): 5 shapes within the float64 bound (worst 0.000 of the bound), 0 edges refused by the kernel +N/A sums vulkan gdn split g (f32): declares none sums +PASS nonfinite vulkan gdn conv prefill out+state (bf16): 6 non-finite and 67578 finite outputs match the float64 classes +PASS repeat vulkan gdn conv prefill out+state (bf16): five runs byte-identical (135168 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan gdn conv prefill out+state (bf16): 5 shapes within the float64 bound (worst 0.996 of the bound), 0 edges refused by the kernel +PASS sums vulkan gdn conv prefill out+state (bf16): within its bound at k 128; fp16 sums would miss infx, bf16 0.0x (these stress inputs do not separate bf16 tap sums beyond the rounded output bound; fp16 overflows) +PASS nonfinite vulkan gdn conv decode out+state (bf16): 6 non-finite and 67578 finite outputs match the float64 classes +PASS repeat vulkan gdn conv decode out+state (bf16): five runs byte-identical (135168 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan gdn conv decode out+state (bf16): 5 shapes within the float64 bound (worst 0.996 of the bound), 0 edges refused by the kernel +PASS sums vulkan gdn conv decode out+state (bf16): within its bound at k 128; fp16 sums would miss infx, bf16 0.0x (these stress inputs do not separate bf16 tap sums beyond the rounded output bound; fp16 overflows) +PASS nonfinite vulkan gdn prefill y (bf16): 1029 non-finite and 9211 finite outputs match the float64 classes +PASS repeat vulkan gdn prefill y (bf16): five runs byte-identical (16384 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan gdn prefill y (bf16): 7 shapes within the float64 bound (worst 0.931 of the bound), 0 edges refused by the kernel +PASS sums vulkan gdn prefill y (bf16): within its bound at k 128; fp16 sums would miss infx, bf16 32.6x (the kv dot's bf16 error enters the state only scaled by beta and the budget's magnitude term already carries the f32 chain: the fp16 margin proves fp32 sums) +PASS nonfinite vulkan gdn prefill hf+snap (f32): 32896 non-finite and 229248 finite outputs match the float64 classes +PASS repeat vulkan gdn prefill hf+snap (f32): five runs byte-identical (1048576 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan gdn prefill hf+snap (f32): 7 shapes within the float64 bound (worst 0.000 of the bound), 0 edges refused by the kernel +PASS sums vulkan gdn prefill hf+snap (f32): within its bound at k 128; fp16 sums would miss infx, bf16 0.1x (the kv dot's bf16 error enters the state only scaled by beta and the budget's magnitude term already carries the f32 chain: the fp16 margin proves fp32 sums) +PASS nonfinite vulkan gdn decode y (bf16): 1928 non-finite and 14456 finite outputs match the float64 classes +PASS repeat vulkan gdn decode y (bf16): five runs byte-identical (32768 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan gdn decode y (bf16): 5 shapes within the float64 bound (worst 0.966 of the bound), 0 edges refused by the kernel +PASS sums vulkan gdn decode y (bf16): within its bound at k 128; fp16 sums would miss infx, bf16 2.7x (the kv dot's bf16 error enters the state only scaled by beta and the budget's magnitude term already carries the f32 chain: the fp16 margin proves fp32 sums) +PASS nonfinite vulkan gdn decode state (f32): 32896 non-finite and 229248 finite outputs match the float64 classes +PASS repeat vulkan gdn decode state (f32): five runs byte-identical (1048576 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan gdn decode state (f32): 5 shapes within the float64 bound (worst 0.103 of the bound), 0 edges refused by the kernel +PASS sums vulkan gdn decode state (f32): within its bound at k 128; fp16 sums would miss infx, bf16 0.0x (the kv dot's bf16 error enters the state only scaled by beta and the budget's magnitude term already carries the f32 chain: the fp16 margin proves fp32 sums) +FAIL nonfinite control: qmm fmax drops NaN: 1 of 5 outputs differ in class; first at 0: finite where float64 gives nan +CONTROL control: qmm fmax drops NaN: red at nonfinite, as planted +FAIL repeat control: atomic add row sum: 4 of 4 repeats differ from the first run's bytes, first at byte 0 +CONTROL control: atomic add row sum: red at repeat, as planted +FAIL repeat control: row sum scribbles input: 4 of 4 repeats differ from the first run's bytes, first at byte 0 +CONTROL control: row sum scribbles input: red at repeat, as planted +FAIL shapes control: row sum drops K tail: at 4x1x4097 output 0 is -4.846729e1 where float64 gives -4.784619e1: 197.89 of its bound +CONTROL control: row sum drops K tail: red at shapes, as planted +FAIL sums control: dot accumulates in fp16: infx over its exact-sum bound at k 4096: not fp32 sums (fp16 would miss 26436825x, bf16 16777216x) +CONTROL control: dot accumulates in fp16: red at sums, as planted +SUMMARY Apple M1 Pro (G13S C0) gdn group: 8 kernels: 8 pass gates 1-4, 0 fail, 0 known findings; 6 controls: 6 caught, 0 missed; 0 limit failures; gates 3334 ms +CONTRACT gdn: PASS +== datamove +MILESTONE device-found name="Apple M1 Pro (G13S C0)" vendor=0x10005 storage16=true int16=true timeout=60000ms +PASS nonfinite vulkan cast_f32_bf16 (RNE): the stated rule holds: outputs equal the contract's RNE bytes: ties to even, bf16 subnormals included, a NaN keeps its class +PASS repeat vulkan cast_f32_bf16 (RNE): five runs byte-identical (292 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan cast_f32_bf16 (RNE): 4 shapes exact by its own check (worst 0.000 of the bound), 3 edges refused by the kernel +N/A sums vulkan cast_f32_bf16 (RNE): declares none sums +PASS nonfinite vulkan cast_bf16_f32 (exact widening): the stated rule holds: outputs equal the reference bits: bf16 widening is exact, every value and NaN byte copies +PASS repeat vulkan cast_bf16_f32 (exact widening): five runs byte-identical (584 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan cast_bf16_f32 (exact widening): 4 shapes exact by its own check (worst 0.000 of the bound), 3 edges refused by the kernel +N/A sums vulkan cast_bf16_f32 (exact widening): declares none sums +PASS nonfinite vulkan copy_u32 (bit copy): the stated rule holds: outputs equal the source bytes: a raw bit copy, every value and NaN pattern included +PASS repeat vulkan copy_u32 (bit copy): five runs byte-identical (1200 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan copy_u32 (bit copy): 7 shapes exact by its own check (worst 0.000 of the bound), 0 edges refused by the kernel +N/A sums vulkan copy_u32 (bit copy): declares none sums +PASS nonfinite vulkan copy_u16 (bit copy): the stated rule holds: outputs equal the source bytes: a raw bit copy, every value and NaN pattern included +PASS repeat vulkan copy_u16 (bit copy): five runs byte-identical (600 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan copy_u16 (bit copy): 4 shapes exact by its own check (worst 0.000 of the bound), 3 edges refused by the kernel +N/A sums vulkan copy_u16 (bit copy): declares none sums +PASS nonfinite vulkan gather_u32 (bit rows): the stated rule holds: outputs equal the addressed row's bytes; an out-of-range id's row is zeros, never another row (ops_q4.zig) +PASS repeat vulkan gather_u32 (bit rows): five runs byte-identical (160 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan gather_u32 (bit rows): 7 shapes exact by its own check (worst 0.000 of the bound), 0 edges refused by the kernel +N/A sums vulkan gather_u32 (bit rows): declares none sums +PASS nonfinite vulkan gather_u16 (bit rows): the stated rule holds: outputs equal the addressed row's bytes; an out-of-range id's row is zeros, never another row (ops_q4.zig) +PASS repeat vulkan gather_u16 (bit rows): five runs byte-identical (80 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan gather_u16 (bit rows): 7 shapes exact by its own check (worst 0.000 of the bound), 0 edges refused by the kernel +N/A sums vulkan gather_u16 (bit rows): declares none sums +PASS nonfinite vulkan dequant_bf16 (q4 g64 RNE): the stated rule holds: one fp32 expression, then the contract's RNE: a non-finite scale or bias makes the output the fp32 expression's class +PASS repeat vulkan dequant_bf16 (q4 g64 RNE): five runs byte-identical (1536 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan dequant_bf16 (q4 g64 RNE): 7 shapes exact by its own check (worst 0.000 of the bound), 0 edges refused by the kernel +N/A sums vulkan dequant_bf16 (q4 g64 RNE): declares none sums +RESULT datamove on "Apple M1 Pro (G13S C0)": kernels=7 passed=7 failed=0 controls=0 known=0 +CONTRACT datamove: PASS +== attention +MILESTONE device-found elapsed_ms=6 name="Apple M1 Pro (G13S C0)" vendor=0x10005 device=0x0000 api=1.4.362 storage16=true int16=true shared=32768 fence-timeout=60000ms +MILESTONE rope elapsed_ms=11 case="queries rows4 base0" rows=4 base=0 worst=4.964008589780876e-1 of bound, repeats byte-identical, passthrough tail bit-exact, input unchanged, planted outputs refused +MILESTONE rope elapsed_ms=13 case="queries rows2 base5" rows=2 base=5 worst=4.8822881879460084e-1 of bound, repeats byte-identical, passthrough tail bit-exact, input unchanged, planted outputs refused +MILESTONE sdpa elapsed_ms=16 case="decode n=1" rows=1 prefix=0 visible=[1..1] worst=0e0 of bound, repeats byte-identical, planted outputs refused, inputs unchanged +MILESTONE sdpa elapsed_ms=21 case="decode n=16 tile" rows=1 prefix=15 visible=[16..16] worst=3.5347427802135684e-1 of bound, repeats byte-identical, planted outputs refused, inputs unchanged +MILESTONE sdpa elapsed_ms=26 case="decode n=17 tile+1" rows=1 prefix=16 visible=[17..17] worst=3.9242733174609323e-1 of bound, repeats byte-identical, planted outputs refused, inputs unchanged +MILESTONE sdpa elapsed_ms=47 case="decode n=255 scan" rows=1 prefix=254 visible=[255..255] worst=3.2373066331518274e-1 of bound, repeats byte-identical, planted outputs refused, inputs unchanged +MILESTONE sdpa elapsed_ms=61 case="decode n=256 scan" rows=1 prefix=255 visible=[256..256] worst=3.5630466330042704e-1 of bound, repeats byte-identical, planted outputs refused, inputs unchanged +MILESTONE sdpa elapsed_ms=77 case="decode n=257 scan+1" rows=1 prefix=256 visible=[257..257] worst=3.44416466623321e-1 of bound, repeats byte-identical, planted outputs refused, inputs unchanged +MILESTONE sdpa elapsed_ms=127 case="decode n=1024 stride" rows=1 prefix=1023 visible=[1024..1024] worst=3.371824275163813e-1 of bound, repeats byte-identical, planted outputs refused, inputs unchanged +MILESTONE sdpa elapsed_ms=179 case="decode n=1025 stride+1" rows=1 prefix=1024 visible=[1025..1025] worst=3.1211365844085626e-1 of bound, repeats byte-identical, planted outputs refused, inputs unchanged +MILESTONE sdpa elapsed_ms=518 case="decode n=7167 stream-1" rows=1 prefix=7166 visible=[7167..7167] worst=3.099820299106263e-1 of bound, repeats byte-identical, planted outputs refused, inputs unchanged +MILESTONE sdpa elapsed_ms=865 case="decode n=7168 stream" rows=1 prefix=7167 visible=[7168..7168] worst=3.0423502310343786e-1 of bound, repeats byte-identical, planted outputs refused, inputs unchanged +MILESTONE sdpa elapsed_ms=921 case="prefill rows32 n1..32" rows=32 prefix=0 visible=[1..32] worst=3.8573441919364143e-1 of bound, repeats byte-identical, rows decode alone bit-identical, planted outputs refused, inputs unchanged +MILESTONE sdpa elapsed_ms=1368 case="prefill rows17 across 1024" rows=17 prefix=1007 visible=[1008..1024] worst=3.454415083464824e-1 of bound, repeats byte-identical, rows decode alone bit-identical, planted outputs refused, inputs unchanged +MILESTONE sdpa elapsed_ms=6671 case="prefill rows32 to 7168" rows=32 prefix=7136 visible=[7137..7168] worst=3.1143891982294897e-1 of bound, repeats byte-identical, rows decode alone bit-identical, planted outputs refused, inputs unchanged +RESULT attention-contract elapsed_ms=6679 on "Apple M1 Pro (G13S C0)": passed=15 total=15 +CONTRACT attention: PASS +== greedy +MILESTONE greedy-contract device-found name="Apple M1 Pro (G13S C0)" vendor=0x10005 device=0x0000 api=1.4.362 storage16=true int16=true fence-timeout=60000ms +error: greedy: non-finite bf16 logit at index 0 of 248320; row refused +error: greedy: non-finite bf16 logit at index 0 of 248320; row refused +error: greedy: non-finite bf16 logit at index 0 of 248320; row refused +error: greedy: non-finite bf16 logit at index 0 of 248320; row refused +error: greedy: non-finite bf16 logit at index 0 of 248320; row refused +PASS nonfinite vulkan greedy draw: finite_logits, argreduce_chunk, argreduce_combine (bf16): the stated rule holds: any non-finite anywhere in the row refuses it, winner or not; the largest value wins; exact ties (including +0/-0) go to the lowest index +PASS repeat vulkan greedy draw: finite_logits, argreduce_chunk, argreduce_combine (bf16): five runs byte-identical (4 bytes), inputs and guards untouched, no overlap +PASS shapes vulkan greedy draw: finite_logits, argreduce_chunk, argreduce_combine (bf16): 7 shapes exact by its own check (worst 0.000 of the bound), 0 edges refused by the kernel +N/A sums vulkan greedy draw: finite_logits, argreduce_chunk, argreduce_combine (bf16): declares none sums +FAIL nonfinite control: fmax row max (drops a NaN): row 0 did not refuse: it reported 2139095040 where the first non-finite sits at 0 +CONTROL control: fmax row max (drops a NaN): red at nonfinite, as planted +SUMMARY vulkan greedy contract on "Apple M1 Pro (G13S C0)": 1 kernel, 1 pass gates 1-4, 0 fail; 1 control: 1 red as planted, 0 missed +CONTRACT greedy: PASS +== pointwise +MILESTONE device-found elapsed_ms=5 name="Apple M1 Pro (G13S C0)" vendor=0x10005 device=0x0000 type=integrated api=1.4.362 storage16=true int16=true preserve32=false flush32=true fence-timeout=60000ms +MILESTONE residual-add elapsed_ms=14 case="random 512" elements=512 matches the f32-add + RNE-store pipeline bit for bit, subnormal-class-flush-allowed=false, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE residual-add elapsed_ms=17 case="cancel 512" elements=512 matches the f32-add + RNE-store pipeline bit for bit, subnormal-class-flush-allowed=false, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE residual-add elapsed_ms=19 case="classes 20" elements=20 matches the f32-add + RNE-store pipeline bit for bit, subnormal-class-flush-allowed=true, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE swiglu elapsed_ms=22 case="random 512" elements=512 worst=0.9668 of bound at element 471, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE swiglu elapsed_ms=24 case="controls 16" elements=16 worst=0.5616 of bound at element 9, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE rms-norm elapsed_ms=27 case="1x2048" rows=1 width=2048 worst=0.9742 of bound at row 0 col 669, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE rms-norm elapsed_ms=30 case="4x2048 offsets zero row" rows=4 width=2048 worst=0.9861 of bound at row 2 col 478, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused, zero row exactly zero +MILESTONE rms-norm elapsed_ms=33 case="2x2048 dynamic range" rows=2 width=2048 worst=0.9722 of bound at row 1 col 1079, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE rms-norm elapsed_ms=36 case="2x256 head_norm offsets" rows=2 width=256 worst=0.9734 of bound at row 0 col 213, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE preserve-add elapsed_ms=38 case="random 512" elements=512 matches the stage 2 add pipeline bits over the DenormPreserve image, strict on subnormal sums, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE preserve-add elapsed_ms=41 case="cancel 512" elements=512 matches the stage 2 add pipeline bits over the DenormPreserve image, strict on subnormal sums, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +KNOWN preserve-add case="classes 20": 1 subnormal sums read as zero, honest by design — the device reports preserve32=false (shaderDenormPreserveFloat32 = 0) and flushes fp32 denormals, so the DenormPreserve image cannot keep them: recorded, not fitted +MILESTONE output-gate elapsed_ms=46 case="random 2x2048" rows=2 worst=0.9081 of bound at row 1 col 983, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE output-gate elapsed_ms=49 case="controls 2x2048" rows=2 worst=0.3234 of bound at row 0 col 8, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE gated-norm elapsed_ms=53 case="1x16x128" tokens=1 head-rows=16 width=128 worst=0.0750 of bound at row 0 col 1016, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE gated-norm elapsed_ms=71 case="32x16x128 dynamic zero token" tokens=32 head-rows=512 width=128 worst=0.0763 of bound at row 2 col 191, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused, zero token exactly zero +MILESTONE gated-norm elapsed_ms=75 case="controls 3x16x128" tokens=3 head-rows=48 width=128 worst=0.0760 of bound at row 2 col 1342, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +RESULT contract-pointwise elapsed_ms=75 on "Apple M1 Pro (G13S C0)": passed=16 known=1 total=17 +CONTRACT pointwise: PASS +KERNEL CONTRACT: PASS diff --git a/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/gpu.log b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/gpu.log new file mode 100644 index 00000000..6f7c1720 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/gpu.log @@ -0,0 +1,66 @@ +== stage 1 +MILESTONE device-found elapsed_ms=21 name="Apple M1 Pro (G13S C0)" vendor=0x10005 device=0x0000 type=integrated api=1.4.362 driver="Honeykrisp" info="Mesa 26.3.0-devel (git-9323171c12)" subgroup=32 storage16=true int16=true max-storage-range=2147483647 max-buffer-size=137438953472 fence-timeout=60000ms +MILESTONE cast-f32-bf16 elapsed_ms=67 elements=146 vectors=18 randoms=128 exact bits, tails unchanged +MILESTONE cast-bf16-f32 elapsed_ms=68 elements=146 vectors=18 randoms=128 exact bits, tails unchanged +MILESTONE copy-u32 elapsed_ms=69 elements=9 src_off=64 dst_off=128 exact bytes, guards and source unchanged +MILESTONE copy-u16 elapsed_ms=70 elements=22 src_off=128 dst_off=256 exact bytes, guards and source unchanged +MILESTONE gather-u32 elapsed_ms=72 rows=6 cols=10 tokens=4 rows exact incl repeat, out-of-range id gathers zeros, tails unchanged +MILESTONE gather-bf16 elapsed_ms=73 rows=6 cols=10 tokens=4 rows exact incl repeat, out-of-range id gathers zeros, tails unchanged +MILESTONE check-ids elapsed_ms=74 valid ids pass, boundary id refused before upload +MILESTONE embedding elapsed_ms=76 case="6 tok 8 rows k64" tokens=6 rows=8 k=64 within bf16 bound, ids include a repeat, table and tails unchanged +MILESTONE embedding elapsed_ms=79 case="3 tok 4 rows k128 repeats" tokens=3 rows=4 k=128 within bf16 bound, ids include a repeat, table and tails unchanged +MILESTONE project elapsed_ms=82 case="m1 n8 k64" worst=0.7485 of bound at row 0 col 1, max_abs=2.522643655538559e-3, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE project elapsed_ms=88 case="m2 n257 k128" worst=0.8880 of bound at row 0 col 131, max_abs=7.288329303264618e-3, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE project elapsed_ms=93 case="m2 n256 k128 offsets" worst=0.9205 of bound at row 0 col 35, max_abs=1.5103191137313843e-2, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE project elapsed_ms=97 case="m3 n8 k64 cancel" worst=0.6477 of bound at row 0 col 4, max_abs=4.5108795166015625e-4, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +RESULT stage1 elapsed_ms=97 on "Apple M1 Pro (G13S C0)": passed=13 total=13 +STAGE 1: PASS +== stage 2 +MILESTONE device-found elapsed_ms=5 name="Apple M1 Pro (G13S C0)" vendor=0x10005 device=0x0000 type=integrated api=1.4.362 driver="Honeykrisp" info="Mesa 26.3.0-devel (git-9323171c12)" subgroup=32 storage16=true int16=true max-storage-range=2147483647 max-buffer-size=137438953472 fence-timeout=60000ms preserve32=false flush32=true denorm-independence=1 +MILESTONE residual-add elapsed_ms=24 case="random 512" elements=512 matches f32-add + RNE-store with subnormal-class-flush-allowed=false, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE residual-add elapsed_ms=27 case="cancel 512" elements=512 matches f32-add + RNE-store with subnormal-class-flush-allowed=false, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE residual-add elapsed_ms=31 case="classes 20" elements=20 matches f32-add + RNE-store with subnormal-class-flush-allowed=true, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE swiglu elapsed_ms=34 case="random 512" elements=512 worst=0.9787 of bound at element 124, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE swiglu elapsed_ms=37 case="controls 16" elements=16 worst=0.5616 of bound at element 9, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE rms-norm elapsed_ms=41 case="1x2048" rows=1 width=2048 worst=0.9873 of bound at row 0 col 1339, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE rms-norm elapsed_ms=44 case="4x2048 offsets zero row" rows=4 width=2048 worst=0.9873 of bound at row 0 col 1339, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused, zero row exactly zero +MILESTONE rms-norm elapsed_ms=48 case="2x2048 dynamic range" rows=2 width=2048 worst=0.9791 of bound at row 1 col 220, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +MILESTONE rms-norm elapsed_ms=51 case="2x256 head_norm offsets" rows=2 width=256 worst=0.9778 of bound at row 1 col 67, repeats byte-identical, inputs and guards unchanged, planted nan/+inf/-inf refused +RESULT stage2 elapsed_ms=51 on "Apple M1 Pro (G13S C0)": passed=9 total=9 +STAGE 2: PASS +== stage 3 +MILESTONE device-found elapsed_ms=3 name="Apple M1 Pro (G13S C0)" vendor=0x10005 device=0x0000 api=1.4.362 storage16=true int16=true shared=32768 fence-timeout=60000ms +MILESTONE rope elapsed_ms=61 case="queries rows4 base0" rows=4 base=0 worst=4.964008589780876e-1 of bound, repeats byte-identical, passthrough tail bit-exact, input unchanged, planted outputs refused +MILESTONE rope elapsed_ms=64 case="queries rows2 base5" rows=2 base=5 worst=4.8822881879460084e-1 of bound, repeats byte-identical, passthrough tail bit-exact, input unchanged, planted outputs refused +MILESTONE cache elapsed_ms=67 case="cache prefix2 base2 rows3 cap8" base=2 rows=3 capacity=8 keys worst=4.954321215226423e-1 of bound, V transport bit-exact, poison rows untouched, inputs unchanged +MILESTONE sdpa elapsed_ms=80 case="sdpa prefix2 rows3 cap8" prefix=2 rows=3 visible-counts={ 3, 4, 5 } worst=5.687629560222356e-2 of bound, repeats byte-identical, nan/large-finite/zero future keys bit-identical, q unchanged, planted outputs refused +MILESTONE gate elapsed_ms=87 case="gate rows4" rows=4 worst=4.8945424413889344e-1 of bound, repeats byte-identical, inputs unchanged, planted outputs refused +RESULT stage3 elapsed_ms=87 on "Apple M1 Pro (G13S C0)": passed=4 total=4 +STAGE 3: PASS +== stage 4 +MILESTONE device-found elapsed_ms=4 name="Apple M1 Pro (G13S C0)" vendor=0x10005 device=0x0000 api=1.4.362 storage16=true int16=true subgroups=63 shuffle-relative=true subgroup-size=32 fence-timeout=60000ms +MILESTONE conv-split elapsed_ms=82 tokens=8 split worst=1.1318588482563632e-2 conv worst=9.960479179851554e-1 of bounds, conv input and state carry-out bit-exact, repeats byte-identical, inputs unchanged, planted outputs refused +MILESTONE split-standalone worst=3.689453278087952e-2 of bound +MILESTONE prefill elapsed_ms=121 tokens=8 chunk=8 chunks=null worst=6.315034419925415e-1 of bound, hf matches independent f64 reference from poison, repeats byte-identical, h0 and soa unchanged, planted outputs refused +MILESTONE split-standalone worst=3.689453278087952e-2 of bound +MILESTONE prefill elapsed_ms=167 tokens=8 chunk=4 chunks=1 worst=6.315034419925415e-1 of bound, hf matches independent f64 reference from poison, repeats byte-identical, h0 and soa unchanged, planted outputs refused +MILESTONE decode elapsed_ms=190 worst=9.852585125692864e-1 of bound, repeats byte-identical, inputs unchanged, planted outputs refused +MILESTONE conv-decode elapsed_ms=205 conv worst=9.960479179851554e-1 split worst=7.421311625377545e-3 of bounds, carry-out state bit-exact, split ran on the ACTUAL activated bits, repeats byte-identical, inputs unchanged, planted outputs refused +MILESTONE norm elapsed_ms=209 rows=4 worst=2.750397409250156e-3 of bound, repeats byte-identical, inputs unchanged, planted outputs refused +RESULT stage4 elapsed_ms=209 on "Apple M1 Pro (G13S C0)": passed=6 total=6 +STAGE 4: PASS +== stage 5 +MILESTONE device-found elapsed_ms=5 name="Apple M1 Pro (G13S C0)" vendor=0x10005 device=0x0000 api=1.4.362 storage16=true int16=true subgroups=63 shuffle-relative=true subgroup-size=32 fence-timeout=60000ms +MILESTONE greedy elapsed_ms=24 gate="vocab-248320" count=248320 token=124160 reference=124160 repeats=3 identical inputs-guards-unchanged +MILESTONE greedy elapsed_ms=29 gate="ties-across-chunks" count=248320 token=1 reference=1 repeats=3 identical inputs-guards-unchanged +MILESTONE greedy elapsed_ms=35 gate="all-negative" count=248320 token=124160 reference=124160 repeats=3 identical inputs-guards-unchanged +MILESTONE greedy elapsed_ms=46 gate="signed-zero-both-orders" count=248320 plus-first-token=5 minus-first-token=5 reference=lowest-index repeats=3 identical inputs-guards-unchanged +error: greedy: non-finite bf16 logit at index 82773 of 248320; row refused +error: greedy: non-finite bf16 logit at index 124160 of 248320; row refused +error: greedy: non-finite bf16 logit at index 165546 of 248320; row refused +MILESTONE greedy elapsed_ms=62 gate="nonfinite-refused" count=248320 nan-first-bad=82773 pinf-first-bad=124160 ninf-first-bad=165546 verdict=NonFinite decode-refuses inputs-guards-unchanged +MILESTONE greedy elapsed_ms=64 gate="min-count-2" count=2 token=1 reference=1 repeats=3 identical inputs-guards-unchanged +MILESTONE greedy elapsed_ms=65 gate="odd-count-refused" count=7 refused=Misaligned before-any-dispatch +RESULT stage5 elapsed_ms=65 on "Apple M1 Pro (G13S C0)": passed=7 total=7 +STAGE 5: PASS +GPU GATES: PASS diff --git a/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/multicase-results.json b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/multicase-results.json new file mode 100644 index 00000000..ad12a997 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/multicase-results.json @@ -0,0 +1,402 @@ +[ + { + "case": "single", + "exit": 1, + "stopped": [], + "log": "MILESTONE engine-ready elapsed_ms=641 capacity=256 model_context=262144 logits_bytes=496640\nMILESTONE run1-done elapsed_ms=12397\nMILESTONE run2-done elapsed_ms=24238\nRESULT qwen35-model elapsed_ms=24341: ids_match_a=false ids_match_b=false repeats(ids=true,logits=true) oracle_logits_mismatches=6772589 expected_hash=d7ba3d4be7fe0481d3eacab1a2950429e280542ac72d7cbf0d6e632692248fea got_hash=b5bc444ea3496f37e6fd686d7ff621586dc468c6993b26f6b7c7c2506a35a1f6\nRESULT execution_mode=teacher-forced: oracle ids fed as previous tokens; per-step agreement, not a free-running chain proof\n", + "result": { + "status": "mismatch", + "backend": "vulkan-qwen35-first-core", + "steps": 32, + "execution_mode": "teacher-forced", + "prefill_schedule": "chunk32", + "context_cap": 256, + "prompt_chunks": 1, + "prefill_chunk_rows": 32, + "capacity": 256, + "model_context": 262144, + "prompt_tokens": 13, + "input_npy_sha256": "970793cfe9f875211c71a0784ceef184ae96dfe11ac8ca6f32e572e2f0fb2897", + "prompt_u32le_sha256": "58906779ec0ce915a130efda3a987ad6aa45e6425109e0f67b72775e7a34f0f6", + "generated_ids": [ + 9419, + 0, + 2500, + 628, + 353, + 1438, + 488, + 30, + 248046, + 198, + 248044, + 248045, + 846, + 198, + 12675, + 248046, + 198, + 248045, + 74455, + 198, + 248068, + 271, + 248069, + 271, + 9419, + 0, + 2500, + 628, + 353, + 1438, + 488, + 30 + ], + "generated_ids_hash": "b5bc444ea3496f37e6fd686d7ff621586dc468c6993b26f6b7c7c2506a35a1f6", + "logits_bytes": 15892480, + "logits_bf16_sha256": "fabfc66f23d47cef0e6f2b63785010bceaa53e9987b9ea07f13fcc6c6d48ce54", + "repeat_checks": { + "runs": 2, + "generated_ids_equal": true, + "logits_bytes_equal": true + }, + "oracle_match": { + "ids_run_a": false, + "ids_run_b": false + }, + "oracle": { + "generated_ids_hash": "d7ba3d4be7fe0481d3eacab1a2950429e280542ac72d7cbf0d6e632692248fea", + "logits_bf16_hash": "280237f0960a9e88b0946d453d0d3d2e59af982d9b70f91ab0aa40c51e27409d", + "logits_bytes": 15892480, + "checkpoint_note": "local CPU float32 cached reference; not FP64" + }, + "oracle_logits_element_mismatches": 6772589, + "elapsed_ms": 24341 + }, + "rmse": 0.042325879528808986, + "baseline_rmse": 0.04655662537948323, + "rmse_ratio": 0.9091268790169087, + "non_tie_flips": [], + "finite": true + }, + { + "case": "unicode", + "exit": 0, + "stopped": [], + "log": "MILESTONE engine-ready elapsed_ms=703 capacity=256 model_context=262144 logits_bytes=496640\nMILESTONE run1-done elapsed_ms=13716\nMILESTONE run2-done elapsed_ms=27003\nRESULT qwen35-model elapsed_ms=27103: ids_match_a=true ids_match_b=true repeats(ids=true,logits=true) oracle_logits_mismatches=6726758 expected_hash=a721d6f007e65cdca3c22dd7afc3c9394fcdd2895fdffe3d4e3eaed31fc60dca got_hash=a721d6f007e65cdca3c22dd7afc3c9394fcdd2895fdffe3d4e3eaed31fc60dca\nRESULT execution_mode=teacher-forced: oracle ids fed as previous tokens; per-step agreement, not a free-running chain proof\n", + "result": { + "status": "ok", + "backend": "vulkan-qwen35-first-core", + "steps": 32, + "execution_mode": "teacher-forced", + "prefill_schedule": "chunk32", + "context_cap": 256, + "prompt_chunks": 2, + "prefill_chunk_rows": 32, + "capacity": 256, + "model_context": 262144, + "prompt_tokens": 36, + "input_npy_sha256": "c90a0ff0f8e7d4b73a747798ade7a5e185a38a27d2aee23ac7b1cfca5cd15ee7", + "prompt_u32le_sha256": "8141f39debfecf1a4e92c1f9ecb33cbf249f587092d15a972b64e36cc94e8e46", + "generated_ids": [ + 22961, + 1900, + 25213, + 1725, + 191718, + 72163, + 84146, + 11, + 307, + 16811, + 51424, + 6167, + 907, + 7925, + 10838, + 234, + 99, + 29545, + 248046, + 198, + 248044, + 248045, + 74455, + 271, + 248068, + 198, + 31248, + 11, + 353, + 1144, + 310, + 14260 + ], + "generated_ids_hash": "a721d6f007e65cdca3c22dd7afc3c9394fcdd2895fdffe3d4e3eaed31fc60dca", + "logits_bytes": 15892480, + "logits_bf16_sha256": "f867c703e0016de64d6488035cdb5c4f0578ec21f831df87dbdd2a451594244e", + "repeat_checks": { + "runs": 2, + "generated_ids_equal": true, + "logits_bytes_equal": true + }, + "oracle_match": { + "ids_run_a": true, + "ids_run_b": true + }, + "oracle": { + "generated_ids_hash": "a721d6f007e65cdca3c22dd7afc3c9394fcdd2895fdffe3d4e3eaed31fc60dca", + "logits_bf16_hash": "035c0dca78d45490ffcb18a6abc6fd97731f881e965ceb4afbfec593eca1cd3b", + "logits_bytes": 15892480, + "checkpoint_note": "local CPU float32 cached reference; not FP64" + }, + "oracle_logits_element_mismatches": 6726758, + "elapsed_ms": 27103 + }, + "rmse": 0.04916991481312748, + "baseline_rmse": 0.04732244977098923, + "rmse_ratio": 1.0390399282175544, + "non_tie_flips": [], + "finite": true + }, + { + "case": "code", + "exit": 1, + "stopped": [], + "log": "MILESTONE engine-ready elapsed_ms=726 capacity=256 model_context=262144 logits_bytes=496640\nMILESTONE run1-done elapsed_ms=14295\nMILESTONE run2-done elapsed_ms=27733\nRESULT qwen35-model elapsed_ms=27828: ids_match_a=false ids_match_b=false repeats(ids=true,logits=true) oracle_logits_mismatches=6662349 expected_hash=bdf4ec226db8b0c27763f440aadeedfa320fc736d2136bbabd67991981e4554d got_hash=5b3e6cd74f3c59622c34c5275beaf5ea6095ea7255eb859d2275eac862aea0fe\nRESULT execution_mode=teacher-forced: oracle ids fed as previous tokens; per-step agreement, not a free-running chain proof\n", + "result": { + "status": "mismatch", + "backend": "vulkan-qwen35-first-core", + "steps": 32, + "execution_mode": "teacher-forced", + "prefill_schedule": "chunk32", + "context_cap": 256, + "prompt_chunks": 2, + "prefill_chunk_rows": 32, + "capacity": 256, + "model_context": 262144, + "prompt_tokens": 36, + "input_npy_sha256": "34ac2f4d4ef196fecfc34e727890f45fe86b24ce4782573dc34ffc53e79c7097", + "prompt_u32le_sha256": "4c637e01f8e374fd671d0a58af54d1e14c7c91c4307a35360cd8bc8712441ae0", + "generated_ids": [ + 71093, + 12305, + 198, + 12237, + 198, + 8275, + 1340, + 76938, + 27435, + 271, + 1919, + 4536, + 5529, + 264, + 709, + 310, + 10724, + 279, + 307, + 7324, + 76938, + 1324, + 198, + 940, + 449, + 83876, + 5313, + 11, + 864, + 369, + 777, + 4779 + ], + "generated_ids_hash": "5b3e6cd74f3c59622c34c5275beaf5ea6095ea7255eb859d2275eac862aea0fe", + "logits_bytes": 15892480, + "logits_bf16_sha256": "14557c9a99cde821fc69edb2af5417f79b61c2217949ae726dc73e57f0baf1cb", + "repeat_checks": { + "runs": 2, + "generated_ids_equal": true, + "logits_bytes_equal": true + }, + "oracle_match": { + "ids_run_a": false, + "ids_run_b": false + }, + "oracle": { + "generated_ids_hash": "bdf4ec226db8b0c27763f440aadeedfa320fc736d2136bbabd67991981e4554d", + "logits_bf16_hash": "ff97a369c7bae3ecbbd826f7a703bf2f05a827ceac869b64fea794d06132b1f6", + "logits_bytes": 15892480, + "checkpoint_note": "local CPU float32 cached reference; not FP64" + }, + "oracle_logits_element_mismatches": 6662349, + "elapsed_ms": 27828 + }, + "rmse": 0.030911139705850507, + "baseline_rmse": 0.029475553767825832, + "rmse_ratio": 1.0487042906583726, + "non_tie_flips": [], + "finite": true + }, + { + "case": "prose", + "exit": 0, + "stopped": [], + "log": "MILESTONE engine-ready elapsed_ms=737 capacity=256 model_context=262144 logits_bytes=496640\nMILESTONE run1-done elapsed_ms=15424\nMILESTONE run2-done elapsed_ms=30214\nRESULT qwen35-model elapsed_ms=30303: ids_match_a=true ids_match_b=true repeats(ids=true,logits=true) oracle_logits_mismatches=6744096 expected_hash=9781fea9dfc234f6c0a80a3c4e65219c1bb8e02a353545ca20957d2d418c709a got_hash=9781fea9dfc234f6c0a80a3c4e65219c1bb8e02a353545ca20957d2d418c709a\nRESULT execution_mode=teacher-forced: oracle ids fed as previous tokens; per-step agreement, not a free-running chain proof\n", + "result": { + "status": "ok", + "backend": "vulkan-qwen35-first-core", + "steps": 32, + "execution_mode": "teacher-forced", + "prefill_schedule": "chunk32", + "context_cap": 256, + "prompt_chunks": 2, + "prefill_chunk_rows": 32, + "capacity": 256, + "model_context": 262144, + "prompt_tokens": 63, + "input_npy_sha256": "60d8c2a9680bc02cbbee85bc0dbfb1326643473e957fdfff6fc539fb4d297560", + "prompt_u32le_sha256": "18d538dca673be2554b3112a778df4342141f5149f99cb1d2b42e32cb43c7e87", + "generated_ids": [ + 760, + 12433, + 2197, + 383, + 7348, + 310, + 3286, + 279, + 7786, + 364, + 279, + 491, + 6522, + 19403, + 11, + 694, + 1238, + 264, + 33073, + 9915, + 8559, + 6829, + 11, + 61892, + 11, + 321, + 279, + 7832, + 24024, + 11, + 781, + 6426 + ], + "generated_ids_hash": "9781fea9dfc234f6c0a80a3c4e65219c1bb8e02a353545ca20957d2d418c709a", + "logits_bytes": 15892480, + "logits_bf16_sha256": "39b0b9eeba2ecf26da307b878740cf017aaadc5df606bb6967806e33c3d0d41c", + "repeat_checks": { + "runs": 2, + "generated_ids_equal": true, + "logits_bytes_equal": true + }, + "oracle_match": { + "ids_run_a": true, + "ids_run_b": true + }, + "oracle": { + "generated_ids_hash": "9781fea9dfc234f6c0a80a3c4e65219c1bb8e02a353545ca20957d2d418c709a", + "logits_bf16_hash": "5aad1a10fb9c073f019046eb13821a94267a841ba51b36b41dce315f2bff744b", + "logits_bytes": 15892480, + "checkpoint_note": "local CPU float32 cached reference; not FP64" + }, + "oracle_logits_element_mismatches": 6744096, + "elapsed_ms": 30303 + }, + "rmse": 0.027858421549332393, + "baseline_rmse": 0.028039759816311564, + "rmse_ratio": 0.9935328166800601, + "non_tie_flips": [], + "finite": true + }, + { + "case": "math", + "exit": 0, + "stopped": [], + "log": "MILESTONE engine-ready elapsed_ms=705 capacity=256 model_context=262144 logits_bytes=496640\nMILESTONE run1-done elapsed_ms=14998\nMILESTONE run2-done elapsed_ms=28783\nRESULT qwen35-model elapsed_ms=28887: ids_match_a=true ids_match_b=true repeats(ids=true,logits=true) oracle_logits_mismatches=6293920 expected_hash=78605286e2897417cc70dfb69cb6aef237cf175b5a32522d1fdb03fcec2e66be got_hash=78605286e2897417cc70dfb69cb6aef237cf175b5a32522d1fdb03fcec2e66be\nRESULT execution_mode=teacher-forced: oracle ids fed as previous tokens; per-step agreement, not a free-running chain proof\n", + "result": { + "status": "ok", + "backend": "vulkan-qwen35-first-core", + "steps": 32, + "execution_mode": "teacher-forced", + "prefill_schedule": "chunk32", + "context_cap": 256, + "prompt_chunks": 2, + "prefill_chunk_rows": 32, + "capacity": 256, + "model_context": 262144, + "prompt_tokens": 47, + "input_npy_sha256": "17140b38c373c6a3e429b1896bf2e60578d7489f98416df4d434ca17066378da", + "prompt_u32le_sha256": "23fce833587d065db8ac2c4014aaa12025ef9c7f400d26602e1278fff8c7e7ac", + "generated_ids": [ + 1206, + 1423, + 279, + 18085, + 854, + 11, + 567, + 1144, + 310, + 10724, + 279, + 2702, + 854, + 4284, + 310, + 5640, + 279, + 5821, + 321, + 1179, + 884, + 421, + 7836, + 310, + 279, + 24125, + 854, + 13, + 271, + 13962, + 14392, + 220 + ], + "generated_ids_hash": "78605286e2897417cc70dfb69cb6aef237cf175b5a32522d1fdb03fcec2e66be", + "logits_bytes": 15892480, + "logits_bf16_sha256": "330a983db746a10fe4fc962e27b270a359a663b4084687146dbc75471911f252", + "repeat_checks": { + "runs": 2, + "generated_ids_equal": true, + "logits_bytes_equal": true + }, + "oracle_match": { + "ids_run_a": true, + "ids_run_b": true + }, + "oracle": { + "generated_ids_hash": "78605286e2897417cc70dfb69cb6aef237cf175b5a32522d1fdb03fcec2e66be", + "logits_bf16_hash": "8740bc9a038a02bcd934213c4c7fd30fda68cf3a21ed5f84a3ebc823aa15119e", + "logits_bytes": 15892480, + "checkpoint_note": "local CPU float32 cached reference; not FP64" + }, + "oracle_logits_element_mismatches": 6293920, + "elapsed_ms": 28887 + }, + "rmse": 0.02618492421477201, + "baseline_rmse": 0.03005468944964068, + "rmse_ratio": 0.8712425479773196, + "non_tie_flips": [], + "finite": true + } +] diff --git a/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher-analysis.json b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher-analysis.json new file mode 100644 index 00000000..be1172e1 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher-analysis.json @@ -0,0 +1,12 @@ +{ + "rmse": 0.028839626910811458, + "live_mlx_rmse": 0.031829616408239544, + "rmse_ratio_to_live": 0.9060626600371443, + "per_case_margin": 1.15, + "argmax_agree_rows": 32, + "rows": 32, + "non_tie_flips": [], + "finite": true, + "reference": "local CPU float32, teacher-forced 32 rainbow rows", + "qualification": "single case only, not full-model or upstream FP64 gate" +} diff --git a/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher-long-analysis.json b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher-long-analysis.json new file mode 100644 index 00000000..7441fcec --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher-long-analysis.json @@ -0,0 +1,32 @@ +{ + "reference": "CPU float32, 256 teacher-forced steps on retained MLX-generated sequence", + "tensorfold_rmse": 0.02758001445247974, + "mlx_rmse": 0.029627193203245927, + "ratio": 0.9309020352781209, + "finite": true, + "tf_vs_cpu_argmax_differences": [ + 167 + ], + "tf_non_tie_flips_margin_0_5": [], + "mlx_vs_cpu_argmax_differences": [ + 167 + ], + "row167": { + "row": 167, + "cpu_top_id": 3605, + "cpu_second_id": 1061, + "cpu_margin": 0.08872413635253906, + "tensorfold_top_id": 1061, + "mlx_teacher_top_id": 1061, + "mlx_generated_id": 3605, + "cpu_logits_on_tf_and_generated": { + "tf": 20.0578670501709, + "generated": 20.146591186523438 + }, + "tensorfold_logits_on_tf_and_generated": { + "tf": 20.125, + "generated": 20.125 + } + }, + "scope": "one long prompt; comparison is not an FP64 gate or causation proof" +} diff --git a/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher-long-result.json b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher-long-result.json new file mode 100644 index 00000000..e8acfe59 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher-long-result.json @@ -0,0 +1 @@ +{"status":"mismatch","backend":"vulkan-qwen35-first-core","steps":256,"execution_mode":"teacher-forced","prefill_schedule":"chunk32","context_cap":384,"prompt_chunks":2,"prefill_chunk_rows":32,"capacity":384,"model_context":262144,"prompt_tokens":41,"input_npy_sha256":"7fe1b864d7d8f84588ac69e357004d96b4dc3613deee372b5b51d333c5294c7b","prompt_u32le_sha256":"b14934e665cfa9cce472adca55c38966c2b5b72a2c45fb2da684346b749f0099","generated_ids":[32,46026,369,264,26811,5629,24057,421,13273,948,37728,80291,440,2919,6756,86412,303,279,16078,11,6611,264,19142,314,7736,421,567,1436,303,279,12515,13,1061,27374,2376,369,264,6150,916,1315,314,20665,15394,1985,15722,11,21172,11,82655,11,321,279,19489,8937,13,1946,3418,1204,264,46026,7346,11,799,1902,1118,2814,279,5706,314,3000,321,279,7465,314,2919,6756,86412,13,271,760,1817,11690,440,279,4202,314,37728,1083,264,2919,6756,10502,13,7806,4009,369,22687,314,660,9155,89661,314,279,63358,19142,11,23245,494,2438,310,76990,13,1577,1439,42655,3599,279,6756,10502,11,781,12460,264,10728,440,264,4918,18766,2932,1857,1056,3594,13,50275,11,279,3000,66828,1441,321,89600,11,264,1817,3750,430,1985,15722,13,8938,2086,89661,314,3000,5640,506,2086,23944,11,781,18766,519,506,9781,2086,25111,13,1061,3000,11,3322,279,21354,43796,11,89600,279,3140,11,1345,76990,3000,11,440,279,37847,43796,11,89600,279,1379,13,1061,23956,314,7736,369,2512,82655,13,271,47626,15783,279,6756,10502,11,279,3000,17754,35456,287,264,2018,1985,15722,430,424,40693,279,1142,314,279,6756,10502,13,4213,11,279,1752,314,279,3000,17754,369,524,264,7435,1500,26,424,34742,59833,430,424,33060,1472,279,6756,10502,13,1061,79299,369,279,1067],"generated_ids_hash":"61091510bfebfff836dbb086e2bfbd34e7193136937b8a83aaf38b94f3585df4","logits_bytes":127139840,"logits_bf16_sha256":"9fdd490d6d53c96fa9db4cb408d364aa29020bd7c183db6633602a4f07dfc8ca","repeat_checks":{"runs":2,"generated_ids_equal":true,"logits_bytes_equal":true},"oracle_match":{"ids_run_a":false,"ids_run_b":false},"oracle":{"generated_ids_hash":"248f95d0c3a6512df53efd580ff38d04b9fd5773cb8e4cec0016cdc04293637a","logits_bf16_hash":"9319e92ddf7e65e64477f50aa8767d6a03aee93d68bdff2ebce20e7b5b0e01f7","logits_bytes":127139840,"checkpoint_note":"local CPU float32 teacher-forced on installed MLX generated tokens; not FP64"},"oracle_logits_element_mismatches":52003367,"elapsed_ms":182373} \ No newline at end of file diff --git a/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher-long.log b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher-long.log new file mode 100644 index 00000000..ae49e1b6 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher-long.log @@ -0,0 +1,5 @@ +MILESTONE engine-ready elapsed_ms=670 capacity=384 model_context=262144 logits_bytes=496640 +MILESTONE run1-done elapsed_ms=91820 +MILESTONE run2-done elapsed_ms=181986 +RESULT qwen35-model elapsed_ms=182373: ids_match_a=false ids_match_b=false repeats(ids=true,logits=true) oracle_logits_mismatches=52003367 expected_hash=248f95d0c3a6512df53efd580ff38d04b9fd5773cb8e4cec0016cdc04293637a got_hash=61091510bfebfff836dbb086e2bfbd34e7193136937b8a83aaf38b94f3585df4 +RESULT execution_mode=teacher-forced: oracle ids fed as previous tokens; per-step agreement, not a free-running chain proof diff --git a/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher-result.json b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher-result.json new file mode 100644 index 00000000..01d8da04 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher-result.json @@ -0,0 +1 @@ +{"status":"ok","backend":"vulkan-qwen35-first-core","steps":32,"execution_mode":"teacher-forced","prefill_schedule":"chunk32","context_cap":256,"prompt_chunks":1,"prefill_chunk_rows":32,"capacity":256,"model_context":262144,"prompt_tokens":27,"input_npy_sha256":"df42aa9735a3aa62b82883cb8931712b5214e0ccfe039e3142b045cb9a25db78","prompt_u32le_sha256":"5c40d63a5af79a85728ab312e16dba27cc4f0d0e5df8bec21b26944597c24c53","generated_ids":[29108,4009,33060,1472,279,16078,321,5055,18766,21479,318,65,305,8,430,424,27891,264,10849,6508,13,198,760,3000,1179,25133,974,279,1142,314,279,6756],"generated_ids_hash":"3bf415fdbda6bccbc3edac925a1160e8fec1ecc64c0543ed24fd3a01790a8983","logits_bytes":15892480,"logits_bf16_sha256":"5cbb2a3d213d6a5b082bceec26c53b8311426eac4c49d8175791c146043a5b7c","repeat_checks":{"runs":2,"generated_ids_equal":true,"logits_bytes_equal":true},"oracle_match":{"ids_run_a":true,"ids_run_b":true},"oracle":{"generated_ids_hash":"3bf415fdbda6bccbc3edac925a1160e8fec1ecc64c0543ed24fd3a01790a8983","logits_bf16_hash":"421e70789136b75daa0e0f024b9bbd76d68fe31b252f349ec5a4d8a9ade46958","logits_bytes":15892480,"checkpoint_note":"local CPU float32 cached reference; not FP64"},"oracle_logits_element_mismatches":6437111,"elapsed_ms":24815} \ No newline at end of file diff --git a/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher.log b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher.log new file mode 100644 index 00000000..7be16920 --- /dev/null +++ b/mseries/local-ai/receipts/2026-10-30-tensorfold-b3ab9ba/teacher.log @@ -0,0 +1,5 @@ +MILESTONE engine-ready elapsed_ms=672 capacity=256 model_context=262144 logits_bytes=496640 +MILESTONE run1-done elapsed_ms=12589 +MILESTONE run2-done elapsed_ms=24712 +RESULT qwen35-model elapsed_ms=24815: ids_match_a=true ids_match_b=true repeats(ids=true,logits=true) oracle_logits_mismatches=6437111 expected_hash=3bf415fdbda6bccbc3edac925a1160e8fec1ecc64c0543ed24fd3a01790a8983 got_hash=3bf415fdbda6bccbc3edac925a1160e8fec1ecc64c0543ed24fd3a01790a8983 +RESULT execution_mode=teacher-forced: oracle ids fed as previous tokens; per-step agreement, not a free-running chain proof diff --git a/mseries/local-ai/upstreams.json b/mseries/local-ai/upstreams.json index 9f29bbe7..3a86e38f 100644 --- a/mseries/local-ai/upstreams.json +++ b/mseries/local-ai/upstreams.json @@ -4,8 +4,8 @@ "omarchy-mlx": { "repo": "joshuaswarren/omarchy-mlx", "track": "main", - "pin": "5e40ecf953e8b907dcae1ce6caadce6ad62b0e0f", - "pin_label": "v0.7.34", + "pin": "42b30a2de2f8b42e673cc50eaca9f7b145f04ac6", + "pin_label": "v0.7.35", "step_rule": "Step only when upstream moves its install.sh MLX_LM_VERSION default or cuts a release; never run ahead of it.", "install_checkout": "omarchy-mlx", "patches": []