Every workflow was written for GitHub-hosted runners (ubuntu-latest,
macos-latest, macos-13, windows-latest, ubuntu-24.04-arm). This fleet's
Forgejo runners register different labels — `linux`, `linux-arm64`,
`macos`, `windows` — so as written, enabling Actions would queue every
job against a label no runner answers, and they would hang forever.
Mapping applied:
ubuntu-latest / ubuntu-24.04-arm -> linux / linux-arm64
macos-latest -> macos windows-latest -> windows
macos-13 (Intel Mac) -> dropped: the fleet has no Intel-Mac runner, and
by the matrices' own stated logic it adds no arch coverage (x86_64 is
held by linux + windows, arm64 by linux-arm64 + the macos reference).
Also: the macOS runner is a `host` executor launched from launchd, whose
PATH omits ~/.cargo/bin, so a raw `rustup` call is not found. wai-conformance
uses raw rustup across the matrix, so it now prepends ~/.cargo/bin to
$GITHUB_PATH first — a no-op on the platforms where cargo is already found.
All 10 jobs across 7 workflows parse and resolve to fleet labels. Note:
this makes the workflows *dispatchable*; the per-job conformance logic
(ONNX fixtures, cross-arch byte goldens) is what the first real runs verify.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
56 lines
2.7 KiB
YAML
56 lines
2.7 KiB
YAML
name: WAI neural decoders end-to-end
|
|
|
|
# The float neural decoders (elic / mlicpp / glc / dcvc / snac) cannot make
|
|
# WAI's cross-architecture byte-equality promise — their ONNX synthesis is
|
|
# float, so the low bits differ by hardware (this is exactly why the
|
|
# integer-exact int_synth path exists, and why only it is in the byte-equality
|
|
# matrix). What they CAN be is *correct end-to-end* on a real machine: entropy
|
|
# decode → ONNX synthesis → image assembly, reproducing a reference within ORT
|
|
# float rounding (±4). This job proves that, with no committed model blobs:
|
|
# the committed tool builds minimal synthetic CompressAI-compatible models +
|
|
# bitstreams, and the Rust decoders reproduce each reference. It runs only when
|
|
# the neural decode code or the generator changes — not on every cargo class.
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
paths:
|
|
- 'wai/wai-rs/src/neural/**'
|
|
- 'wai/wai-rs/tests/neural_native_decode.rs'
|
|
- 'wai/tools/wai_validate_synthetic.py'
|
|
- '.github/workflows/wai-neural-e2e.yml'
|
|
pull_request:
|
|
paths:
|
|
- 'wai/wai-rs/src/neural/**'
|
|
- 'wai/wai-rs/tests/neural_native_decode.rs'
|
|
- 'wai/tools/wai_validate_synthetic.py'
|
|
- '.github/workflows/wai-neural-e2e.yml'
|
|
|
|
jobs:
|
|
neural-e2e:
|
|
name: synthetic fixtures → Rust decode → reference (±4)
|
|
runs-on: linux
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
- uses: actions/setup-python@v5
|
|
with:
|
|
python-version: '3.11'
|
|
- name: ML stack (CPU torch + torchvision + compressai + onnxruntime)
|
|
run: |
|
|
python -m pip install --upgrade pip
|
|
# torch AND torchvision from the CPU index so their compiled ops match
|
|
# (compressai imports torchvision; a mismatched build fails at
|
|
# `torchvision::nms does not exist`).
|
|
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
|
|
# `onnx` (the exporter) is separate from `onnxruntime` (the decoder).
|
|
pip install compressai onnx onnxruntime numpy pillow
|
|
- name: Build the synthetic fixtures (elic / mlicpp / snac / dcvc / glc)
|
|
working-directory: wai
|
|
run: python tools/wai_validate_synthetic.py --size 256
|
|
- name: Rust 1.97.1
|
|
run: rustup toolchain install 1.97.1 --profile minimal && rustup default 1.97.1
|
|
- name: Each Rust decoder reproduces its reference end-to-end
|
|
working-directory: wai/wai-rs
|
|
# --no-default-features: the neural decoders need only `ort`, NOT the C
|
|
# codec chain (AV1/JXL/opus), so the job needs no system codec deps.
|
|
run: cargo test --no-default-features --features neural --test neural_native_decode -- _matches_reference --nocapture
|