28c2ffb84f
Reference-count the process-global ONNX Runtime across embedder and routing-head sessions, make close idempotent, and require named proof that both aggregate routing gates executed rather than self-skipped (V-716). Owner explicitly requested direct commits to master.
66 lines
2.3 KiB
Markdown
66 lines
2.3 KiB
Markdown
# ONNX aggregate gate lifecycle — 2026-08-13
|
|
|
|
Vikunja: V-716.
|
|
|
|
## Finding
|
|
|
|
`router.NewONNXEmbedder` initialized `onnxruntime_go` unconditionally. Its
|
|
`Close` method destroyed the model session but left the package-global runtime
|
|
environment alive. In one Go process the first `TestONNX*` therefore ran and
|
|
every later constructor returned `The onnxruntime has already been initialized`.
|
|
Those tests converted the constructor error into `t.Skip`, so the aggregate
|
|
package still reported `PASS`.
|
|
|
|
Reproduction before the fix:
|
|
|
|
```text
|
|
TestONNXBaseline PASS classifier+onnx 72/96
|
|
TestONNXRoutingHeads SKIP onnx: init environment: already initialized
|
|
package PASS
|
|
```
|
|
|
|
## Contract
|
|
|
|
The router now owns ONNX Runtime through reference-counted leases. Every model
|
|
session holds one lease; routing heads hold their own, so daemon shutdown order
|
|
cannot unload the library underneath a live graph. The last lease destroys an
|
|
environment Maven initialized. Package `TestMain` holds one extra lease across
|
|
all model-aware tests in `internal/router/eval` and `cmd/mavend`.
|
|
|
|
The aggregate router command additionally requires two named gates to record
|
|
execution only after all of their model dependencies loaded. A second-test
|
|
skip can no longer satisfy the command.
|
|
|
|
## Measurement
|
|
|
|
Runtime and model:
|
|
|
|
```text
|
|
deps/onnxruntime-linux-x64-1.26.0/lib/libonnxruntime.so.1.26.0
|
|
models/embedder/multilingual-e5-small/model_quantized.onnx
|
|
models/embedder/router-heads/router_heads.onnx
|
|
```
|
|
|
|
Focused aggregate, one process:
|
|
|
|
```text
|
|
TestONNXBaseline PASS 72/96 full (75.0%), destination 11/33
|
|
TestONNXRoutingHeads PASS 93/96 full (96.9%), destination 25/33
|
|
ONNX aggregate proof: verified 2 required model gates:
|
|
[TestONNXBaseline TestONNXRoutingHeads]
|
|
```
|
|
|
|
The separate lifecycle test released the last lease and successfully acquired
|
|
the runtime again. A second same-process package run also executed all three
|
|
selected mavend gates without a skip:
|
|
|
|
```text
|
|
TestONNXPersonalBoundary PASS 29/29
|
|
TestONNXPersonalBoundaryFourFold PASS 99/104
|
|
TestONNXTopics PASS 43/43
|
|
```
|
|
|
|
Finally, `make eval-router` completed the full package. In addition to the two
|
|
required proof gates, `TestONNXClaimConfidenceDistribution` and
|
|
`TestReachBaselineONNX` executed; ecosystem reach remained 28/30.
|