Skip to content

hyperloom custom workload: box conditions do not record whether another lane held the NPU, so a GPU arm cannot say it was measured beside an NPU job #1197

Closed

Description

@bong-water-water-bong

bench_summary.box (added in #1034) records the conditions a custom-workload number was measured in: tctl_c, gtt_used_gib, gtt_total_gib, mem_available_gib, and on the summary tctl_c_min/tctl_c_max/tctl_samples.

It does not record the NPU. For this workload that is the condition that has mattered most:

  • This box's policy (okf policies/strixhalo-thermal-and-gpu-claims.md, "Coexistence vs contention", 2026-11-05) is that the two engines coexist safely — the real cross-engine hazard is a shared dma-buf range, not simultaneity — but a GPU arm beside a running NPU matrix corrupts both lanes' numbers. That makes NPU occupancy a condition of the score, in the same class as the die temperature.
  • The long-context arm in this lane (HL_MTP_MAX=0, 20,480 ctx / 18,800-token leg, 27B UD-Q4_K_XL) was offered 27 times on 2026-11-05 and produced no number, every refusal on an "is the NPU idle" gate. Had one of those attempts measured beside a job, its JSON could not have said so — and with the gate relaxed to "record instead of refuse" (which is what the policy above calls for), an unattributable number is exactly what would be produced.

So a reader of a result cannot currently tell a clean arm from one measured beside an NPU job, which is the same defect class as #947 (no device stack), #993 (no model fingerprint), #996 (no box conditions), #1008 (no placement) and #1062 (no drafting): the artifact cannot answer a question about itself.

Field wanted, in the same shape as the rest of box, read device-free from the claim files:

"box": {
  "tctl_c": 61.75, "tctl_c_min": 61.75, "tctl_c_max": 74.62, "tctl_samples": 4,
  "gtt_used_gib": 51.39, "gtt_total_gib": 120.0, "mem_available_gib": 61.49,
  "npu_holder": "npu-serve-keeper pid 4675", "npu_job": false, "npu_queued": 0,
  "npu_job_samples": 0, "npu_samples": 4
}

npu-serve-keeper (the owner's resident serve) is baseline box state and must not read as contention; npu_job_samples/npu_samples are needed because a job can start after the arm is claimed (the same reason tctl_samples exists).

Fixed in the PR that closes this; reproducer is a direct box_conditions() call on both trees, where origin/main 29ec80c6 returns no npu* key at all.

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions