Skip to content

Releases: sqliteai/waste

v0.6.2

Choose a tag to compare

@marcobambini marcobambini released this 01 Aug 12:42

Fixed

  • waste info and waste run crashed on K3 on every x86 build
    (#10). The tensors the
    loader skips — the vision tower, and anything outside tensor_prefix
    kept group at 0, and the row-scratch sizing divided by it. The
    architecture decided what that meant: arm64's sdiv answers 0 and the
    run continues, x86's idiv raises #DE. waste plan was unaffected
    because it does not load. §37.
  • WASTE_Q8=0 could not load a 4-bit trunk
    (#6) — that is, any
    container a default tools/convert.py run produces. The dequantizer
    read one byte per weight, true of Q8G alone, while catching every
    quantized format. It now decodes through waste_deq_row, the one place
    that knows all three widths. The same lines also predated waste_f16's
    subnormal fix and flushed group scales below 6.1e-05 to zero.
  • embed_tokens stays on disk under WASTE_Q8=0, as it does
    otherwise: 7.93 → 6.52 GiB of peak RSS on Kimi-Linear, identical logits.
    The f32-equivalence check now differs from the default path in the
    storage width alone, which is what it claims to compare.

Added

  • Router lookahead in the decode path. At the end of a MoE layer, once
    its reads are consumed and the disk is about to idle through the next
    layer's attention, layer L+1's router runs on layer L's hidden state and
    issues speculative reads for its top 6. Demand hit rate 14–19% → 38–40%
    with total bytes read unchanged (254.2 → 254.5 GB): the records were
    going to be read anyway, and only when changes. Nine paired runs,
    median 1.17x. WASTE_LOOKAHEAD=0 disables. §34, §35.
  • WASTE_MLOCK wires the trunk and the expert cache; WASTE_MLOCK=cache
    wires the cache alone. Off by default — Linux's RLIMIT_MEMLOCK is
    commonly 8 MB. Wiring the trunk is worth 3x in the transition zone around
    52 GiB and nothing below it; it does not move the knee. §30, §31, §32.

Changed

  • tests/run.sh generates its own PyTorch oracle from the container
    under test (16.9 s) instead of diffing against a shipped fixture, which
    can only ever be valid for the container that produced it: expert
    codebooks are k-means, and the same seed on a different --device
    trains different books — one layer of 26 moves the logits by 1.24
    against a 1e-3 threshold. The fixture remains as the fallback where uv
    is absent, with its provenance recorded beside it.
    (#7), §33.
  • tools/make_test_container.py emits what a real conversion does: a
    Q4G/Q8G/F32 trunk rather than Q8G throughout, and --prefix for a
    container whose tensors are not all under its tensor_prefix. Both are
    shapes the suite could not previously reach, and both had a live bug
    behind them.
  • Checks that cannot run now say why instead of reporting a refusal as a
    divergence: WASTE_Q8=0 on K3 wants 211 GB of f32 trunk on a 64 GB
    machine, the oracle prompt is Kimi-Linear's, and a cold hotlist run that
    already missed nothing demonstrates neither outcome
    (#5).

Measured and not adopted

  • Cross-layer prefetch from next_layer_top — gated before building
    and refused: 29.0% recall against a 60% break-even. §29, revisited and
    superseded by the lookahead above in §34.
  • The lookahead in the prefill path. Built, measured, removed: a chunk
    layer's disk is busy continuously, so a prefetch there does not move a
    read into idle time, it moves it in front of another read and pays an
    eviction for it — 7% more bytes. Decode keeps it. §36.

Section numbers refer to docs/LEARNED.md, which carries the reasoning and the full measurements behind each entry.

Full Changelog: v0.6.1...v0.6.2

v0.6.1

Choose a tag to compare

@marcobambini marcobambini released this 31 Jul 11:43

What's Changed

  • Two test failures that were the environment, not the code by @isenbek in #1
  • CLAUDE.md: guidance for Claude Code by @isenbek in #2

New Contributors

Full Changelog: v0.6.0...v0.6.1

v0.6.0

Choose a tag to compare

@marcobambini marcobambini released this 30 Jul 12:46