# Raptor Validation `validate.py` validates every ONNX model below a selected directory. For each model it can: 1. compile an ONNX-MLIR reference library and runner; 2. generate deterministic random inputs; 3. compile PIM artifacts with Raptor; 4. run the reference implementation and functional PIM simulator; 5. compare their outputs; 6. run `pimsim-nn` to report latency and power. Run the script from the repository root with the repository Python environment. ## Prerequisites - A built Raptor compiler, normally `build_release/Release/bin/onnx-mlir`. - ONNX-MLIR runtime headers, normally `onnx-mlir/include`. - The `numpy`, `onnx`, and `colorama` packages installed in `.venv`. - The Rust toolchain used by the functional simulator. - The Rust functional simulator under `backend-simulators/pim/pim-simulator`, unless overridden. - A built `pimsim-nn` under `backend-simulators/pim/pimsim-nn/build`, unless non-functional simulation is skipped or its path is overridden. ## Basic usage Validate the complete operation suite: ```bash .venv/bin/python validation/validate.py \ --raptor-path build_release/Release/bin/onnx-mlir \ --onnx-include-dir onnx-mlir/include \ --operations-dir validation/operations \ --verbose \ --raptor-extra-arg=--pim-detect-communication-deadlock \ --raptor-extra-arg=--pim-export-spatial-dataflow=none ``` Validate one operation category or case: ```bash .venv/bin/python validation/validate.py \ --raptor-path build_release/Release/bin/onnx-mlir \ --onnx-include-dir onnx-mlir/include \ --operations-dir validation/operations/gemm/small ``` Validate a network or network slice: ```bash .venv/bin/python validation/validate.py \ --raptor-path build_release/Release/bin/onnx-mlir \ --onnx-include-dir onnx-mlir/include \ --operations-dir validation/networks/yolo11n/depth_04 ``` `--operations-dir` may point to any directory tree containing `.onnx` files. The script discovers them recursively. ## Validation modes The default mode performs the complete workflow. Use `--compile-only` to build the reference runner and PIM artifacts without executing either implementation: ```bash .venv/bin/python validation/validate.py \ --raptor-path build_release/Release/bin/onnx-mlir \ --onnx-include-dir onnx-mlir/include \ --operations-dir validation/operations/gemm/small \ --compile-only ``` Use `--run-only` to reuse those artifacts and perform input generation, reference execution, simulation, and comparison: ```bash .venv/bin/python validation/validate.py \ --raptor-path build_release/Release/bin/onnx-mlir \ --onnx-include-dir onnx-mlir/include \ --operations-dir validation/operations/gemm/small \ --run-only ``` `--compile-only` and `--run-only` are mutually exclusive. Run-only mode fails with a diagnostic if its required compiled artifacts are missing. ## Parallel execution and output Models run in parallel using all available CPUs by default. Set the worker count with `-j` or `--jobs`: ```bash .venv/bin/python validation/validate.py \ --raptor-path build_release/Release/bin/onnx-mlir \ --onnx-include-dir onnx-mlir/include \ --operations-dir validation/operations \ --jobs 8 ``` ## Options | Option | Description | |---|---| | `-h`, `--help` | Print command help and exit. | | `--raptor-path PATH` | Raptor compiler binary. Required unless `--clean` is used. | | `--onnx-include-dir PATH` | ONNX-MLIR runtime include directory. Required unless `--clean` is used. | | `--operations-dir PATH` | Directory tree containing models. Defaults to `validation/operations`. | | `--simulator-dir PATH` | Functional `pim-simulator` crate directory. Defaults to the in-tree simulator. | | `--non-functional-simulator-build-dir PATH` | `pimsim-nn` build directory. Defaults to the in-tree build. | | `--pimcomp-config {arch-a,arch-b,arch-c}` | Non-functional hardware/timing profile. Defaults to `arch-a`. | | `--skip-non-functional-simulation` | Skip `pimsim-nn` latency and power measurement. | | `--threshold FLOAT` | Absolute output-comparison tolerance. Defaults to `1e-3`. | | `--relative-threshold FLOAT` | Relative output-comparison tolerance. Defaults to `1e-5`. | | `--seed INT` | Seed for generated inputs. Defaults to `0`. | | `--crossbar-size INT` | Crossbar dimensions passed to Raptor. Defaults to the Arch-A value, `128`. | | `--crossbar-count INT` | Crossbars per core passed to Raptor. Defaults to the Arch-A value, `96`. | | `--core-count INT` | PIM core count passed to Raptor. Defaults to the Arch-A value, `168`. | | `--raptor-extra-arg=ARG` | Additional Raptor compiler argument. Repeat for multiple arguments. | | `--command-timeout-seconds FLOAT` | Timeout for each compiler, runner, and simulator subprocess. Defaults to `1000000.0`. | | `-j INT`, `--jobs INT` | Parallel validation workers. Defaults to all available CPUs and must be at least one. | | `--clean` | Remove generated validation artifacts and exit. | | `--compile-only` | Compile reference and PIM artifacts without execution or comparison. | | `--run-only` | Reuse compiled artifacts and perform execution, simulation, and comparison. | | `--verbose` | Print passing per-stage and subprocess logs, plus average PIM pass timings. | Arguments beginning with `--` that are passed through to Raptor should use the equals form: ```bash --raptor-extra-arg=--pim-detect-communication-deadlock ``` ## Hardware profiles and non-functional simulation The selected PIMCOMP profile must match `--core-count`, `--crossbar-count`, and `--crossbar-size`. A mismatch disables only non-functional simulation and prints the incompatible values; functional validation still runs. The checked-in profiles are under `validation/pimsim_configs/pimcomp//latency_config.json`. Use `--skip-non-functional-simulation` when latency and power are not required. The summary reports non-functional results as measured, failed, unsupported, or skipped. Overall PASS/FAIL is determined by compilation and functional output comparison. A non-functional simulation failure remains visible as `ERROR` in the latency and power columns but does not change a functional PASS. `pimsim-nn` does not currently implement the `vsoftmax` instruction. When its explicit unsupported-op diagnostic is encountered, Softmax validations retain their functional PASS and show `UNSUPPORTED` in both non-functional columns. Other `pimsim-nn` failures remain `ERROR`. ## Generated artifacts Artifacts are written beside each model: | Path | Contents | |---|---| | `inputs/` | Generated input CSV files. | | `outputs/` | ONNX-MLIR reference output CSV files. | | `raptor/` | Exported MLIR, dialect snapshots, reports, and final `pim/` artifacts. | | `runner/` | Generated reference runner source, build tree, and shared library. | | `simulation/out.bin` | Functional simulator output used for comparison. | The `raptor/` directory may include `spatial0.mlir`, `spatial1_graph.mlir`, `spatial2_trivial_merged.mlir`, `spatial3_scheduled_no_comm.mlir`, `spatial4_scheduled.mlir`, `pim0.mlir`, `pim1_buff.mlir`, `pim2_folded.mlir`, and `pim3_memory_planned.mlir`. Remove these artifacts for every discovered model with: ```bash .venv/bin/python validation/validate.py \ --operations-dir validation/operations/gemm/small \ --clean ``` `--clean` does not require `--raptor-path` or `--onnx-include-dir`. ## Available suites Checked-in validation networks under `validation/networks/` include `vgg16`, `yolo11n`, and `yolo11nv2`. The generated operation inventory is documented in [`operations/README.md`](operations/README.md). Regenerate its models with: ```bash .venv/bin/python validation/operations/gen_tests.py ``` ## Manual functional simulator tracing After validation has produced a `raptor/pim/` directory, rerun the functional simulator with tracing from its crate directory: ```bash cd backend-simulators/pim/pim-simulator cargo run --no-default-features --features tracing --release \ --package pim-simulator --bin pim-simulator -- \ -f /path/to/workspace/raptor/pim \ -o /path/to/workspace/simulation/out.bin \ -d ,,,,... ``` Tracing writes `TraceCore0`, `TraceCore1`, and so on beside `out.bin`. The validator normally derives the `-d` address and byte ranges from `raptor/pim/config.json` and the model output shapes. ## Results and exit status The final table reports functional pass/fail state and non-functional latency and power. The summary includes pass/fail totals, non-functional simulation counts, total measured latency, and average PIM pass timings when `--verbose` is enabled. - Exit status `0`: all discovered models passed, or cleanup completed. - Exit status `1`: validation failed, the model directory was invalid, or no `.onnx` models were found. - Exit status `2`: command-line arguments were invalid or required arguments were missing.