Files
Raptor/docs/evaluation/pimcomp-reproducibility.md
T
NiccoloN a77edafcbf
Validate Operations / validate-operations (push) Has been cancelled
even better more structured throughput scheduling
plot adjustments
validation adjustments
2026-10-27 17:46:46 +01:00

5.8 KiB
Raw Blame History

Pimcomp reproduction reference

The model README owns provenance, checksums, hardware profiles, and numeric-artifact limitations. The comparison guide owns suite commands, reports, reuse rules, and metric interpretation.

Frontend acceptance versus scheduled computation

The current frontend mapping accepts exactly these ONNX node types:

Add, AveragePool, BatchNormalization, Clip, Concat, Conv, Dropout, Flatten,
Gather, Gemm, GlobalAveragePool, LRN, MatMul, MaxPool, Mul, Pad, Relu, Reshape,
Shape, Sigmoid, Softmax, Squeeze, Sub, Sum, Tanh, Transpose, Unsqueeze

Constant is consumed as metadata rather than emitted as a backend node. Other types cause operation: <type> not considered and stop conversion at the first occurrence. In particular, YOLO11n's Split and Resize are unsupported; the emitted prefix cannot represent a complete inference.

The latency scheduler's explicit no-consider set, also used by hierarchy mapping and GA post-operation accounting, is:

Input, BatchNormalization, Clip, Dropout, Flatten, LRN, MatMul, Reshape,
Softmax, Squeeze, Transpose

See ElementPipelineSchedule.cpp, HierarchyMapping.cpp, and GeneticAlgorithm.cpp. These accepted nodes receive no standalone latency instructions while remaining in the backend graph. Acceptance therefore does not establish timed computation.

Before scheduling, the frontend may fuse BatchNorm/Relu/Tanh/Sigmoid into Conv/Gemm, turn Reshape–Transpose–Reshape into channel shuffle, remove a specific Shape–Gather–Unsqueeze–Concat shape chain, and merge Pad into its consumer. Those transformations differ from both frontend rejection and leaving a node unscheduled. In particular, the BatchNorm correctness gap shows why a fusion label is not proof of numeric equivalence.

Pimsim accepts ISA instructions rather than ONNX operators. Its instruction decoder omits vsoftmax (binary opcode 21) before fetch and warns once per process because it has no timing model. Other unknown opcodes remain errors. Reported timing and energy exclude Softmax work. Functional validation still executes Softmax. The comparison uses full YOLO and GoogLeNet with only its two LRN nodes bypassed. VGG8 and both ResNet graphs retain all operators. The historical *-pimsim-nn.onnx files retain the earlier Softmax-free graphs for result reproduction; they are no longer the suite's selected inputs.

Standalone frontend/backend reproduction

Build Pimcomp with CMake and an OpenMP-capable C++ compiler:

cmake -S third_party/PIMCOMP-NN -B third_party/PIMCOMP-NN/build
cmake --build third_party/PIMCOMP-NN/build --target PIMCOMP-NN

The backend resolves ../config.json, ../models/JSON/<name>.json, and ../output/ relative to its working directory, not its executable. The frontend rewrites its input ONNX batch dimension in place. Use an isolated workspace and a model copy, as the comparison driver does, to preserve source/config files. From the Raptor root, after installing the frontend dependencies:

RAPTOR_ROOT=$PWD
PIMCOMP="$RAPTOR_ROOT/third_party/PIMCOMP-NN"
PIMCOMP_RUN=$(mktemp -d)
mkdir -p "$PIMCOMP_RUN/models/JSON" "$PIMCOMP_RUN/output" "$PIMCOMP_RUN/work"
cp validation/pimsim_configs/pimcomp/arch-a/latency_config.json "$PIMCOMP_RUN/config.json"
cp validation/networks/pimcomp_models/vgg8/vgg8-mnist-reconstructed.onnx "$PIMCOMP_RUN/vgg8.onnx"
.venv/bin/python "$PIMCOMP/frontend/frontend.py" \
  --model_path "$PIMCOMP_RUN/vgg8.onnx" \
  --save_path "$PIMCOMP_RUN/models/JSON/vgg8.json"
(
  cd "$PIMCOMP_RUN/work"
  OMP_NUM_THREADS=1 "$PIMCOMP/build/PIMCOMP-NN" \
    -m=vgg8 -r=GA -p=element -o=YES -v=YES -s=YES
)

Outputs remain under $PIMCOMP_RUN/output. -v=YES emits verification data; -s=YES emits SimulationInfo.gz; -o=YES saves the evaluation report. Use -p=batch for throughput scheduling, with the matching throughput config when running Pimsim. The paper's batch experiment used 128 samples; the current comparison runner's functional batch default is 64. Element mode represents one inference. Select Arch-B/C by copying that profile's config; Arch-C's rectangular crossbars remain unsupported by Raptor.

For the bundled Model Zoo graphs, copy models/JSON/resnet18.json, resnet34.json, or googlenet.json from Pimcomp to the workspace and change -m accordingly. That reproduces bundled graph scheduling; use the suite runner to regenerate graphs from the exact checked-in performance ONNX files.

Genetic algorithm and reproducibility limits

GeneticAlgorithm.h sets population 200 and at most 1000 iterations. -r=GA selects it; standalone backend default replication is balance, whereas the suite explicitly uses GA. GA initialization calls srand(1). Fitness evaluation uses OpenMP with static work distribution; OMP_NUM_THREADS bounds its parallelism (use 1 for serial reproduction), otherwise the OpenMP runtime chooses the thread count.

The fixed GA seed does not make every backend stage deterministic: ElementPipelineSchedule.cpp separately calls srand(time(NULL)). Keep model hashes, source/build revisions, profile, mode, and thread count with experiment results. Compare correctness against the original ONNX reference, including the known batch and BatchNorm failures; neither omitted operators nor prefilled reference intermediates repair those programs.