Skip to content

BaseRT engine 0.2.3

Choose a tag to compare

@prabod prabod released this 19 Aug 04:08
· 13 commits to main since this release
0644388

BaseRT 0.2.3

Model pulls that finish. basert pull downloads over many connections at
once and resumes where it stopped — a 20 GB bundle interrupted at 90% picks
up at 90%, including after the process has exited. The 19.8 GB
Qwen3.5-35B-A3B Q4 bundle measured 17.6 MiB/s before and 54–84 MiB/s
after
on the same link, roughly 19 minutes down to 5. A transfer that stalls
without closing is cut off and retried instead of hanging, and a short transfer
is caught rather than installed. Tool calling is fixed on two fronts as well: Muse Glimmer's
dialect is parsed rather than printed, and templates that use is undefined
(Qwen 3.8 among them) render instead of silently falling back.

Added

Xet transfers

  • Xet is supported, behind BASERT_HF_XET=1. Its advantage is
    deduplication across models: chunks shared with something already fetched
    never cross the wire. It cannot resume, though — an interrupted transfer
    starts over — so it is not what basert pull reaches for by default.

    basert pull basecompute/Qwen3.5-35B-A3B                  # resumable (default)
    BASERT_HF_XET=1 basert pull basecompute/Qwen3.5-35B-A3B  # dedup, no resume

Parallel, resumable downloads

  • Files are fetched over many connections at once, in fixed chunks,
    instead of through one stream.

  • An interrupted pull resumes where it stopped, per chunk: completion is
    recorded next to the partial file as each chunk lands and fsynced, so a
    crash, a ^C, or a link that drops overnight continues from what is on disk,
    across process restarts. Just re-run the same basert pull.

  • A stalled transfer fails instead of hanging. Connections that stop
    delivering bytes without closing are now cut off and retried, and a transfer
    shorter than the size the Hub advertised is reported as an error rather than
    installed as a truncated model that fails later at load time.

  • Tunable when the defaults do not suit a link:

    Variable Default Meaning
    BASERT_HF_CONNECTIONS 24 Concurrent range requests
    BASERT_HF_CHUNK_MB 16 Bytes per range request
    BASERT_HF_READ_TIMEOUT_SECS 60 Stall timeout for a single read
    BASERT_HF_MAX_RETRIES 5 Retries per chunk (0 disables)
    BASERT_HF_XET unset Use Xet's CAS path for large files (dedup, no resume)

    Peak memory is connections × chunk — 384 MB at the defaults, since each
    worker holds one chunk in flight. Lower either knob on a constrained
    machine.

Fixed

  • Muse Glimmer's tool calls are parsed, not printed. The model frames a
    call as a message addressed to the tool:

    <|start|>assistant to=fn<|message|><atem:function_calls>
    <atem:invoke name="fn">…</atem:invoke></atem:function_calls><|eot|>
    

    which matched none of the dialects the parser knew (Gemma-native, ChatML
    JSON, Qwen XML), so it fell through to content and the raw markup was
    streamed to the user — the reported symptom was a reply that read
    <atem:invoke name="bash">. The dialect is now recognized and emitted as a
    proper tool call.

  • --kquant-passthrough embeddings on non-Glimmer models. Every model but
    Muse Glimmer handed k-quant embedding lookups the slab parameter struct,
    whose second field is the vocabulary size where the k-quant kernels expect
    the row width. Rows were read at the wrong stride, and the output was
    incoherent — Qwen3-0.6B was the reported case.

  • developer and function roles no longer break the native template.
    A model's chat template accepts the roles it was written for — Qwen 3.8's
    takes system, user, assistant, tool and raises on anything else — and
    a raise drops the whole request into the generic ChatML fallback, quietly
    costing the model its think prefill and tool-call dialect. developer (which
    superseded system in the newer OpenAI API, and is what agent clients send)
    and function (the deprecated spelling of tool) are now resolved before
    rendering. When a template does reject a role, the warning names the roles
    the request carried instead of suggesting a re-convert that would not help.

  • Chat templates using is undefined no longer fall back to ChatML.
    Qwen 3.8's template gates its reasoning-effort block on
    enable_thinking is undefined, a standard Jinja2 test the bundled template
    engine did not implement. Rendering threw on every request and the server
    quietly fell back to generic ChatML — which still looked right for
    ChatML-shaped models while silently dropping the reasoning-effort system
    block, the think prefill, and the model's entire tool-call dialect. Tool
    calling on affected models works again.

Changed

  • Building tools/base-convert now requires Rust 1.85+ (was 1.80).