Skip to content

CI: get the A5 V4-Pro sweep running and into the daily report - #876

Merged
zhangqi-chen merged 2 commits into
mainfrom
fix/a5-daily-ci-reporting
Jul 31, 2026
Merged

CI: get the A5 V4-Pro sweep running and into the daily report#876
zhangqi-chen merged 2 commits into
mainfrom
fix/a5-daily-ci-reporting

Conversation

@lwDavid

@lwDavid lwDavid commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator

model-tests-a5 has not executed a single test since it was added in #816
every scheduled run died in setup. This gets the DeepSeek V4-Pro sweep running
and its results into the daily report.

Why it never ran

The job failed in setup-ci-job on every run, and each failure hid the next
one behind it. Most were host provisioning and have since been fixed on the
npu-a5-1 runner (CANN_ROOT pointed at a CANN that was not installed; the
conda env, GCC 15 and ccache were absent). One is a real repo bug and is fixed
here.

Check NPU ran npu-smi info directly, which cannot work on that host.
It exits 187 with dcmi module initialize failed. ret is -8005, and the step
runs under bash -e. That reads like a missing DCMI component, but it is
permission denial: since the driver upgrade the device nodes are
crw-rw---- HwHiAiUser:HwHiAiUser and the CI user is not in that group, so
dcmi_init cannot open the character device. npu-smi even lists "Failed to
open the character device"
among its own candidate causes.

$ ls -l /dev/davinci0
crw-rw---- 1 HwHiAiUser HwHiAiUser 235, 0 /dev/davinci0
$ npu-smi info                       -> exit 187
$ task-submit --run 'npu-smi info'   -> exit 0, lists all 8 NPUs

task-submit drops privileges into the HwHiAiUser group — which is how every
model run reaches a card in the first place — so the check now falls back to
it. Direct invocation is tried first, so the 910B runners behave exactly as
before and borrow no card.

Two details the retry needs, both found by running it rather than reasoning
about it:

  • The payload ends on rc=$?; exit $rc rather than on npu-smi info. With the
    probe as the bare last command, task-submit reports 215 even though
    npu-smi returned 0 (reproduced 3/3). Setting the status explicitly makes the
    outer code npu-smi's own — verified to pass 0, 9 and 127 through unchanged,
    so an absent card still fails the step.
  • task-submit leases a real card, so a busy queue makes it give up on the wait
    and exit 1 having run nothing. That says nothing about the NPU, yet it failed
    the job just as the original probe did. An NPUSMI_RC sentinel separates the
    two: present means the probe ran and its status is authoritative; absent
    means the task never got scheduled, which warns and continues.

Getting the results into the report

Even once the sweep ran, its results did not appear. The summary did not
needs the job, so it was built as soon as the sim and a2a3 sweeps finished —
and A5 is the longest of the four:

Job finished
model-tests-sim (both) 01:32 / 01:33
model-tests-a2a3 01:57
Aggregate results summary 02:23 ⬅️ built here
model-tests-a5 02:47

So results-a5 never existed in time and the A5 section always rendered its
"no artifact" placeholder. Adding it to needs fixes that (always() still
lets the summary run when a sweep fails); the summary now starts three seconds
after the A5 job ends.

A5 also gets its own table rather than a column in the shared one. The case
sets are disjoint by construction — model-tests-a5 sweeps only
models/deepseek/v4-pro and the other three jobs exclude it — so a single
matrix made every row half filler, and no row is worth comparing across both.

## Daily CI Model Test Results

### a2a3 and simulators
| Case | a2a3 | a2a3 effective (us) | a2a3sim | a5sim |
...
Passed: **a2a3** 48/48, **a2a3sim** 20/41, **a5sim** 17/41

### a5 (DeepSeek V4-Pro)
| Case | a5 | a5 effective (us) |
| `models/deepseek/v4-pro/rmsnorm.py` | :white_check_mark: | 43.4 |
| `models/deepseek/v4-pro/gate.py`    | :x:                | 93.2 |
...
Passed: **a5** 13/35

Each table carries a per-platform passed count and names any platform whose
artifact is missing, so an absent sweep is never mistaken for a set of skipped
cases — which is precisely what fooled us here.

Report-only, for now

The A5 job is continue-on-error: true. A measured sweep puts V4-Pro at
13/35: 13 cases die with sync_stream_pair device faults, 2 with
rtMalloc failed: 207001, 7 on numerics. Those are pypto/device-side rather
than defects in this repo, so gating on them would paint the workflow red every
night — exactly what has made model-tests-sim's daily failure invisible. The
table is published either way, so the coverage is real even though the check
does not block. Flip it off once the A5 blockers land.

Verification

Exercised end to end on the real npu-a5-1 runner across several runs:

  • The full 35-case sweep completes in ~44-58 min against the job's 120-minute
    budget; slowest case decode_fwd at 417s, inside --max-time 900, and
    nothing hit the cap — no timeout changes needed.
  • 13/35 reproduced on three separate runs.
  • --device auto --device-num 2 schedules fine here (got cards: 2,3 in 2s),
    so the eight # ci: devices=2 V4-Pro files are safe.
  • Summary rendering checked against the real results of runs 30595513890 and
    30599291163, and with the a5, a5sim, and all artifacts removed in turn.
  • ci.yml is untouched; the 910B sim / a2a3 jobs ran green through the
    modified shared action.

Supersedes #859, which GitHub closed when its branch was renamed.

lwDavid added 2 commits July 31, 2026 14:14
model-tests-a5 died in setup on every run, most recently at Check NPU with
npu-smi exiting 187 and "dcmi module initialize failed. ret is -8005".

That is permission denial, not a missing DCMI component. Since the A5 host's
driver upgrade the device nodes are crw-rw---- HwHiAiUser:HwHiAiUser and the CI
user is not in that group, so dcmi_init cannot open the character device —
npu-smi even lists "Failed to open the character device" among its own
candidate causes. task-submit drops privileges into the HwHiAiUser group, which
is how every model run reaches a card in the first place.

Direct invocation is still tried first, so hosts whose device nodes are
world-readable — the 910B runners — behave exactly as before and borrow no
card.

Two details the retry needs, both found by running it:

  - The payload ends on `rc=$?; exit $rc` rather than on `npu-smi info`. With
    the probe as the bare last command task-submit reports 215 even though
    npu-smi returned 0 (reproduced 3/3 on an A5 host); setting the status
    explicitly makes the outer code npu-smi's own. Verified to pass 0, 9 and
    127 through unchanged, so an absent card still fails the step.

  - task-submit leases a real card, so a busy queue makes it give up on the
    wait and exit 1 having run nothing. That says nothing about the NPU, and it
    failed the job just as the original probe did. The NPUSMI_RC sentinel
    separates the two: present means the probe ran and its status is
    authoritative, absent means the task never got scheduled, which warns and
    continues. Every model run goes through task-submit anyway and fails
    loudly when there is no device.

With this the A5 sweep completes for the first time since it was added in #816.
model-tests-a5's results never reached the summary, for two reasons.

The summary did not depend on the job, so it was built as soon as the sim and
a2a3 sweeps finished. The V4-Pro sweep is the longest of the four — 65 min
against their 23-50 — so results-a5 did not exist yet and the A5 section always
rendered its "no artifact" placeholder. Add it to `needs`; `always()` still
lets the summary run when a sweep fails.

Give A5 its own table rather than a column in the shared one. The case sets are
disjoint by construction — model-tests-a5 sweeps only models/deepseek/v4-pro
and the other three jobs exclude it — so a single matrix makes every row half
filler and there is no row worth comparing across both. Each table now carries
a per-platform passed count and names any platform whose artifact is missing,
so an absent sweep is never mistaken for a set of skipped cases.

Mark the A5 job report-only. A measured sweep puts V4-Pro at 13/35: 13 cases
die with sync_stream_pair device faults, 2 with rtMalloc 207001, 7 on numerics
— pypto/device-side rather than defects in this repo, so gating on them would
paint the workflow red nightly, which is exactly what has made
model-tests-sim's daily failure invisible. The table is published either way.

Rendering checked against the real results of runs 30595513890 and 30599291163,
and with the a5, a5sim and all artifacts removed in turn.
@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@lwDavid, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 58 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: c47195ff-2d39-4ce6-bae9-8c59e3d4b9b9

📥 Commits

Reviewing files that changed from the base of the PR and between 54addee and 639bbd5.

📒 Files selected for processing (2)
  • .github/actions/setup-ci-job/action.yml
  • .github/workflows/daily_ci.yml

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@lwDavid lwDavid self-assigned this Jul 31, 2026
@lwDavid lwDavid added the enhancement New feature or request label Jul 31, 2026
@lwDavid lwDavid moved this to Done in pto project Jul 31, 2026
@zhangqi-chen
zhangqi-chen merged commit de65498 into main Jul 31, 2026
13 of 17 checks passed
@zhangqi-chen
zhangqi-chen deleted the fix/a5-daily-ci-reporting branch July 31, 2026 06:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants