YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
SurrealML .surml Output Normaliser Visibility Gap β PoC
Demonstrates that SurMlFile.load() and raw_compute() in surrealml v0.0.4 do not
surface the output normaliser configuration embedded in a .surml header.
A .surml file with an output normaliser returns different numeric values through
raw_compute() and buffered_compute(), with no API-level warning from either path.
Setup
pip install surrealml==0.0.4 onnx==1.21.0 "onnxruntime>=1.20.0" "ml_dtypes>=0.3.0"
aarch64 note: surrealml v0.0.4 ships an x86-64 ONNX Runtime binary inside
libc_wrapper.so. On aarch64 systems, build and use the included shim to redirect ONNX Runtime loading to the system-installed aarch64 library:bash build_dlopen_shim.shthen prefix commands withLD_PRELOAD=./dlopen_intercept.so. This is an environment workaround and is not part of the reported issue.
Step 1: Create .surml with embedded output normaliser
python3 create_model.py .
Output:
ONNX_MODEL_VALID=True
SURML_SAVED=True
OUTPUT_NORMALISER_TYPE=z_score
OUTPUT_NORMALISER_P1=0.0
OUTPUT_NORMALISER_P2=999.0
Step 2: Inspect via load() and raw_compute β normaliser config not surfaced, no warning
python3 inspect_model.py .
Output:
SURML_LOADED=True
LOAD_SURFACES_NORMALISER_CONFIG=False
RAW_COMPUTE_OUTPUT=1.0
WARNING_EMITTED=False
SurMlFile.load() returns only (file_id, name, description, version).
The output normaliser type, parameters, and mapping are not included.
raw_compute() returns the raw ONNX output with no warning that an output normaliser exists.
Step 3: Runtime β buffered_compute applies output normaliser, result diverges
python3 reproduce.py .
Output:
RAW_VALUE=1.0
BUFFERED_VALUE=999.0
OUTPUT_FLIP_CONFIRMED=true
WARNING_EMITTED=False
Summary
| Output | Normaliser applied | Warning | |
|---|---|---|---|
raw_compute([1.0]) |
1.0 | No | None |
buffered_compute({"x": 1.0}) |
999.0 | Yes (z_score) | None |
The gap is that neither load() nor raw_compute() surfaces or warns about the
output normaliser. Workflows that use raw_compute() as a validation path before
using buffered_compute() need a reliable API signal that the buffered path will
apply an output transformation. Without that signal, the validation result can differ
from the served result without the caller being alerted.
Files
| File | SHA-256 |
|---|---|
create_model.py |
381ed9f669fdb138a3ec98debd49c3cbdb31a8f59993b017249fbd1d12271b51 |
inspect_model.py |
ad8e648ce5a3750b39e0729e2a8e3f3c3e45b98236b377ce12b737073090c3ab |
reproduce.py |
dd5db3e7f802b8cb8f45fa6beb306a7eaaa9faece58949545526b1601732ef31 |
dlopen_intercept.c |
2eea3ba286484c22dcebc768df3a0cf756224f496aef993a05c74afbef00e29b |
expected_output.txt |
ba54c3e051270feee4ba28fab7cfc8a7069a3738d894751bfd08a283a24bc929 |
model.surml |
7bf6d816857844e41b2e727b6aad8871cff760debfd84350f5dfc59b105f3e57 |
model.onnx |
7bd0c40611de64286d1eab80f116f67addf0ec221f59b37c478b508ade25c9a8 |