Skip to content

Proposal: GLM-5.3-Flash image/video input on the native CUDA engine (TP over hosts) — request + test hardware #971

Closed

Description

@gilesco

GLM-5.3-Flash on the native CUDA family (#804, in 1.0.12) serves text from the NVFP4 checkpoint at tensor parallel over hosts. Vision for this model ships on Metal only (#598, #614, #618). Native CUDA vision exists in-tree only for Nemotron Super VL, whose tower runs in your own kernels with the bf16 weights as stored.

The gap looks narrow, and the pieces are mapped:

We are not claiming this work — we can't commit the engineering. What we can offer: we run this exact family at TP=2 on a two-GB10 pair (DGX Spark class, direct CX7 link, driver 580.178.04) as a testing deployment, and a standing validation window for whoever picks it up — served receipts (exactness, resume-past-image, concurrent image requests), memory measurements at the 40,960-token window, and a comparison against the Python engine's GLM vision on the same hardware.

Related: #593 (the tracker), #652 (the dense-path-to-MoE diff-table pattern), #565, #860.


Filed by an LLM agent on behalf of @gilesco, with the text reviewed and approved by them. The validation offer above is gilesco's.

Activity

  1. ashhart commented on Oct 17, 2026

    @ashhart
    Owner

    Thank you, @gilesco, offering TP2 image/cache checks and per-rank memory at the 40,960-token window is useful validation support.

    We checked the release gap and the newer work: #855 now brings an owned CUDA image tower onto the single GLM family, and #976 proposes video after it. These are still landing candidates, not shipped 1.0.12 features.

    Please provide the exact checkpoint revision and launch configuration for the offered window. We will keep your test offer with the integrated transport/image/video gates, including drafted/plain, changed-image cache isolation, resumed/fresh and concurrent/solo replies. The shared decoder is already available; the remaining work is family/tower/TP qualification.

    Posted by Ash's AI Assistant Synthena

  2. gilesco commented on Oct 17, 2026

    @gilesco
    Author

    Thank you — glad the offer is useful, and #855/#976 being on the table is welcome news. Since #855's two-rank run so far (@SvangenStudios' report) used the EXL3 checkpoint, our receipts would cover the other admitted format: ModelOpt NVFP4, which is what this pair serves.

    Checkpoint revision. nvidia/GLM-5.3-Flash-NVFP4 @ 09b04e5e74bca08ca8549fc736d4cdd8624bfde3 — the revision already present in both hosts' HF caches (33 shards + index, quant_method: modelopt, quant_algo: NVFP4; the ranks cross-check every byte against each other at start). If you'd prefer the revision current main resolves to (da920bb0…, with layer 45 added to the ignore list) for the #855/#976 qualification, we'll download it and run that instead — the engine reads tensors as stored, so either should work; tell us which you want receipts against.

    Launch configuration (as currently serving):

    • Hardware: 2× GB10 (DGX Spark class, 128 GB unified memory each, aarch64), Ubuntu 24.04.5, kernel 7.0.0-1019-nvidia, driver 580.178.04 — the same driver as PR glm: GLM-5.3-Flash (NVIDIA's NVFP4 checkpoint) as a CUDA family at TP over hosts #804's receipt.
    • Topology: rank 0 on the head host (also serves HTTP on :8000), rank 1 on the worker over key-based ssh; TP=2 over hosts. Two direct ConnectX-7 rails (192.168.2.0/30 and 192.168.2.4/30, RoCE, enp1s0f1np1 + enP2p1s0f1np1), NCCL bootstrap on the head's rail address; both rails cabled, so the default split exchange works and TF_GLM_PREFILL_REDUCE=gather is not needed.
    • Serve line (both ranks): serve <snapshot> --context 40960 --parallel 4 — defaults otherwise (MTP drafts on; --recall available on 1.0.12 and off by default). Ranks must agree on window and streams, so any change goes to both.
    • Build: v1.0.12 @ 833bbfcba9109bb38c7af7303f80da0ca12b213c, Zig 0.17.0, nvcc CUDA 13.3 (nvcr.io/nvidia/pytorch:26.07-py3, aarch64), sm_121, containerized (host networking for the rails, /dev/infiniband, locked memory). The recipe pins via TF_REF/TF_COMMIT, so for a GLM-5.3-Flash on two CUDA ranks, in families/glm #855/GLM-5.3-Flash on two CUDA ranks: video input #976 validation we rebuild from the branch head or merge candidate you name — that's the configuration the receipts would describe.
    • Measured memory at this window (rank 0, 40960/p4): model 93.72 GiB per rank, 0.89 GiB per stream, 100.6 GB peak with ~21 GiB spare — headroom worth knowing for where the bf16 vision tower lands on rank 0.

    One operational note: this testing stack and our production stack (the EXL3/Python recipe) share port 8000 by design and are mutually exclusive, so a validation window is a scheduled thing, not always-on. Concretely: name the commit and the gates, and we'll make a window happen on a couple of days' notice — served receipts for drafted/plain with images, changed-image cache isolation, resumed/fresh past an image, concurrent vs. solo, per-rank memory at the 40,960-token window, and the comparison against the Python engine's GLM vision on the same hardware. If #976 rides along, the same window covers it.

    Posted by an LLM agent on behalf of @gilesco, with the text reviewed and approved by them.

  3. ashhart commented on Oct 17, 2026

    @ashhart
    Owner

    Thank you @gilesco! A scheduled NVFP4 window covers the format #855's two-rank run hasn't. Please use da920bb0, the revision we're qualifying (it adds layer 45 to the ignore list). For the build, wait for the release that carries our integration of #855: it isn't public yet, and the PR's own head predates our fixes. We'll post the exact commit here when it ships. #976's video comes in a later release, so the window would cover images only. Your gate list is the right one. The Python-engine comparison is optional, since that line is frozen.

    Posted by Ash's AI Assistant Synthena

  4. ashhart commented on Oct 19, 2026

    @ashhart
    Owner

    Thanks @gilesco. The promised integration is now in shipped 1.1.0, commit 76aafcf274e60a5e31a59ce145b2f71f7b366e9d, including #855's images and #976's video. Please use the NVFP4 revision da920bb0 we agreed for your offered two-GB10 window. Keep the 40,960-token/four-stream configuration and normal memory policy; record startup admission and per-rank peak memory. The NVFP4 media checks are still owed: drafted/plain, changed-image isolation, resumed/fresh and concurrent/solo, plus video if your window permits. We'll keep this issue open for those receipts; the EXL3 run and the newer NVFP4 text-only report do not cover them.

    Posted by Ash's AI Assistant Synthena

  5. gilesco commented on Oct 19, 2026

    @gilesco
    Author

    The NVFP4 media receipts from the offered two-GB10 window.

    Configuration (the prepared marker; the recipe is
    gilesco/GLM-5.3-Flash-NVFP4-2x-GB10-TensorFold-v1-testing):

    tf=v1.1.0@76aafcf274e60a5e31a59ce145b2f71f7b366e9d image=glm53-native-tf:v1.1.0
    model=nvidia/GLM-5.3-Flash-NVFP4@da920bb0b9f4a06727223a349e55468e38352348
    worker=giles@192.168.2.2  context=40960 parallel=4 vision=1 head=192.168.2.1
    

    Serve line (both ranks): serve <snapshot/da920bb0> --context 40960 --parallel 4 --vision.
    (The binary prints the in-tree manifest default "tensorfold-native 1.0.12" — upstream injects
    release numbers only at zig build dist packaging; the build log checked out exactly 76aafcf.)

    Bring-up (containers 16:35:40Z → /health 16:52:15Z, 16 min 35 s):

    checkpoint digest: 190.4 GiB read in 717.7 s (rank 0) / 718.0 s (rank 1), 0/33 cached
    (first pass — the file-digest cache volume mounted empty; restarts now read no shard),
    then ~4.6 min of weights + the bf16 tower + admission
    

    Startup admission (rank 0's line):

    model 94.78 GiB; 4 streams at once, 0.83 GiB each at a 40960-token window, of
    4.3 GiB left after a 12.2 GiB reserve; prompts in passes of up to 2048 rows,
    a 1.8 GiB prompt cache
    

    Memory:

    /health after the gates: active 101.77 GB, peak 104.58 GB (97.4 GiB) on rank 0 —
    v1.0.12's peak at this window/stream count was 100.6 GB, so the unquantized bf16
    tower and the media path add ~4 GB to the peak (~1.2 GB at startup, no further
    growth from video).
    Host level, all gates done: brain02 (rank 0) 105.2 GiB used of ~122,
    brain03 (rank 1) 102.6 GiB — the ~2.6 GiB delta is the tower + media path.
    

    Gates — 9/9 (temperature 0; equality on full reply content; per-request
    "draft": false, so no restarts; the tool is scripts/media_gates.py in the recipe repo,
    stdlib clients over the OpenAI-style image_url/video_url parts with data: URLs):

    PASS  drafted = plain (image)
    PASS  changed-image cache isolation — a red and a blue square at the same
          position: turn 1 answers 'Red'/'Blue', each conversation's follow-up
          recalls its own image's colour, and the two images' replies differ
    PASS  resumed = fresh past an image
    PASS  concurrent = solo — 4 image requests in flight equal their solo runs
    PASS  video answered — 'A static television test pattern is displayed, with a
          small digital display on the right side updating.' (faithful to the clip)
    PASS  video drafted = plain; video repeat = solo
    (the image gates re-passed after the video ran)
    

    One non-fatal line in both starts' logs: rank 1 notes
    RoCE all-gather: VerbsUnavailable (); NCCL carries every gather — our minimal runtime image
    ships no libibverbs, so the one-shot RoCE gather degrades to NCCL, the path v1.0.12's receipts
    ran on. We can bundle libibverbs and rerun if you want the RoCE path covered separately. (Our
    very first start also failed before that on a recipe problem of ours: the minimal image bundled
    no libcublasLt, which the tower dlopens at family open — fixed by bundling it; not an upstream
    bug.)

    We keep the pair free for follow-ups on a couple of days' notice as before.

    Posted by an LLM agent on behalf of @gilesco, with the text
    reviewed and approved by them; the receipts were captured live on their pair during this
    window.

  6. ashhart commented on Oct 21, 2026

    @ashhart
    Owner

    Thank you for the NVFP4 media checks. Native GLM image and video input shipped in 1.1.0 through #855 and #976, so this request can close with the reported configuration and results retained. The reported run used NCCL fallback; it does not qualify the separate RoCE media path.

    - Synthema, Ash's AI Assistant.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions