open-standards/.github/workflows/wai-quantum-npu.yml
Transaction Science e5191a6079 ci: the 0.5.1 member workflows run only when the pull request's own diff touches them
Neural processor, matrix extension, signal processor, vector units and the
dataflow device gain the same gate as the other wai-quantum workflows.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 19:56:41 -04:00

123 lines
5.6 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: wai-quantum neural-processor member
# The fabric's neural-processor member: exact 32×32 products from 4-bit limbs,
# every limb product and limb sum formed in fp16 on the neural processor (each
# value an integer fp16 holds exactly), the host assembling; certified
# bit-exact against the CPU reference's pinned corpus digests.
#
# - npu-mac (the macOS runner): the platform's model runtime must place every
# operation of the model on the neural processor (its compute plan says so,
# or the member is refused); the device tests must find the declared
# processor, agree with the CPU on the probe and on random states, reproduce
# all four pinned certificates, and catch both model mutants.
# - npu-absent (a Linux container): the same build finds no member and says
# why; the device tests run over no member with the declaration `none`.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
push:
branches: [main]
paths:
- 'wai/wai-quantum/**'
- 'rust-toolchain.toml'
- '.github/workflows/wai-quantum-npu.yml'
pull_request:
paths:
- 'wai/wai-quantum/**'
- 'rust-toolchain.toml'
- '.github/workflows/wai-quantum-npu.yml'
jobs:
# Does this pull request's own diff touch the paths below? This forge matches a
# workflow's `paths:` against the push, so a merge of main into a branch fires the
# workflow whatever the pull request changes; every job here waits on this answer.
# A push to main, a schedule, or anything the script cannot determine answers
# `true` (scripts/pr-touches-paths.py).
relevant:
name: does this change touch it
runs-on: linux-arm64
outputs:
run: ${{ steps.gate.outputs.run }}
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
- id: gate
run: |
set -euo pipefail
r=$(python3 scripts/pr-touches-paths.py .github/workflows/wai-quantum-npu.yml \
"${{ github.event.pull_request.base.sha }}" \
"${{ github.event.pull_request.head.sha }}")
echo "this change touches wai-quantum-npu: $r"
echo "run=$r" >> "$GITHUB_OUTPUT"
npu-mac:
name: member · neural processor (macos)
needs: relevant
if: needs.relevant.outputs.run == 'true'
runs-on: macos
timeout-minutes: 120
env:
WAI_QUANTUM_NPU_EXPECT: npu-0
steps:
- uses: actions/checkout@v5
# launchd's PATH omits cargo on the macOS host runner.
- name: Put cargo on PATH
shell: bash
run: echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
- name: The member's unit tests
shell: bash
working-directory: wai/wai-quantum
run: |
set -euo pipefail
nice -n 10 cargo test --locked --features quantum_fabric_npu --lib -- quantum_fabric_npu:: quantum_fabric::npu:: 2>&1 | tee "$RUNNER_TEMP/unit.log"
grep -qE '^test result: ok\. [1-9][0-9]* passed; 0 failed' "$RUNNER_TEMP/unit.log" || { echo "::error::no unit test ran"; exit 1; }
- name: The member's device tests
shell: bash
working-directory: wai/wai-quantum
run: |
set -euo pipefail
report="$RUNNER_TEMP/npu-report.txt"; : > "$report"
export WAI_QUANTUM_NPU_CACHE="$RUNNER_TEMP/npu-cache"
WAI_QUANTUM_NPU_REPORT="$report" nice -n 10 \
cargo test --locked --release --features quantum_fabric_npu --test npu_member -- --test-threads=1 2>&1 | tee "$RUNNER_TEMP/device.log"
grep -qE '^test result: ok\. 9 passed; 0 failed' "$RUNNER_TEMP/device.log" || { echo "::error::not every device test ran and passed"; exit 1; }
cat "$report"
key="$WAI_QUANTUM_NPU_EXPECT"
grep -qx "npu devices: as declared ($key)" "$report" || { echo "::error::the processor found is not the declared one"; exit 1; }
grep -qE "^npu placement: key=$key( [a-z0-9_.]+=MLNeuralEngineComputeDevice)+$" "$report" || { echo "::error::an operation was not placed on the neural processor"; exit 1; }
n="$(grep -c "^npu certified: key=$key .* parity=bit-exact " "$report")"
[ "$n" = 4 ] || { echo "::error::$n of 4 certificates were earned"; exit 1; }
grep -qx "npu mutants: key=$key killed 2 of 2" "$report" || { echo "::error::a model mutant survived"; exit 1; }
npu-absent:
name: member · neural processor absent (linux)
needs: relevant
if: needs.relevant.outputs.run == 'true'
runs-on: linux
timeout-minutes: 60
env:
WAI_QUANTUM_NPU_EXPECT: none
steps:
- uses: actions/checkout@v5
- name: Install Rust 1.98.0
shell: bash
run: |
export PATH="$HOME/.cargo/bin:$PATH"
command -v rustup >/dev/null 2>&1 || \
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.98.0
rustup toolchain install 1.98.0 --profile minimal
rustup default 1.98.0
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
- name: No neural processor here, and the member says so
shell: bash
working-directory: wai/wai-quantum
run: |
set -euo pipefail
report="$RUNNER_TEMP/npu-report.txt"; : > "$report"
WAI_QUANTUM_NPU_REPORT="$report" cargo test --locked --features quantum_fabric_npu --test npu_member -- --test-threads=1 2>&1 | tee "$RUNNER_TEMP/device.log"
grep -qE '^test result: ok\. 9 passed; 0 failed' "$RUNNER_TEMP/device.log" || { echo "::error::not every device test ran and passed"; exit 1; }
grep -qx 'npu devices: as declared (none)' "$report" || { echo "::error::the absent case was not established"; exit 1; }