Skip to content

Commit 0a2d958

Browse files
authored
onnxsim: Add version 0.7.3 (#2266)
* onnxsim: Add version 0.7.3 Mirrors build-onnxoptimizer.yml: onnxsim vendors onnx-optimizer (which vendors onnx) as git submodules and links onnx/protobuf statically, the same shape already ported. cp310 is dropped for the same reason (onnxoptimizer has no riscv64 onnx wheel there); cp312's abi3 wheel serves 3.12+. * onnxsim: fix matrix so both cp311 and cp312 actually build An include list whose entries share no key with the base matrix collapses onto a single job instead of adding one per entry (confirmed against onnxoptimizer's own CI run, which built only cp312 despite listing cp311 too). Make python a real matrix dimension so include only attaches onnxruntime to the matching combination. * onnxsim: ignore test files with unguarded torch/timm/onnxruntime imports CI confirmed the wheel itself builds and passes abi3audit on both interpreters, but pytest aborts collection outright on test_python_api.py, test_simple.py, test_timm.py, test_rfdetr.py and test_yolo.py: each does a module-level import of torch, timm or onnxruntime with no pytest.importorskip guard, so a missing module is a collection error (exit code 2) rather than a skip. None of those packages have riscv64 wheels (onnxruntime only from cp312, which still lacks timm/rfdetr/ ultralytics/torch), so ignore the files themselves. * onnxsim: pin ir_version in test_profiling's _foldable_model cp312-manylinux_riscv64's test step failed all 10 tests in tests/test_profiling.py: RuntimeError: Your model ir_version 14 is higher than the checker's (13). _foldable_model() builds its onnx.ModelProto via helper.make_model() with no ir_version, so the model is stamped with whatever onnx.IR_VERSION the installed onnx package currently defines - and our registry's newest riscv64 onnx build for cp312 is 1.23.0. onnxsim statically links a vendored onnx (via the onnx-optimizer git submodule, frozen at a pinned commit) whose checker only recognizes up to ir_version 13, so any onnx installed newer than that submodule's pin breaks every caller of _foldable_model() before the test gets to what it actually means to check. Every other test file that builds a model by hand pins ir_version explicitly; test_profiling.py's _foldable_model() was the one holdout. Match the existing convention (ir_version=10) so the fixture stays valid across the range of onnx versions the unpinned runtime dependency can resolve to. Adds the checkout/apply-patches step pair (mirroring build-py-spy.yml) and patches/onnxsim/** to path triggers. * onnxsim: deselect the two Conv+BN fusion checks on cp311 cp311 has no riscv64 onnxruntime wheel, so onnxsim's check_n equivalence check runs through onnx's ReferenceEvaluator instead. For opset 9-13 that dispatches BatchNormalization to BatchNormalization_9, whose inference path is guarded by `if momentum is None` -- but OpRun fills the attribute with its schema default 0.9, so it always takes the momentum branch and blends the batch's own mean/var into the running statistics. The unsimplified Conv+BN model is therefore evaluated wrongly, and the correctly fused single Conv is reported as a mismatch (max diff 5.33 in the riscv64 log). Not riscv64-specific and not a precision issue: onnxsim 0.7.3's PyPI x86_64 wheel with onnx 1.23.0 / numpy 2.4.6 and no onnxruntime fails the same two tests every run (max diff 1.3-3.7). Against a float64 numpy reference, the fused Conv is within 3.7e-6 while the reference evaluator's Conv+BN is off by 16.3 and matches the momentum-blended formula to 2.3e-6. With onnxruntime installed (cp312 here, and every leg of upstream's CI) both tests pass. onnx main still has the same BatchNormalization_9 code. * onnxsim: set ONNXSIM_RELEASE so the wheel is 0.7.3, not 0.7.3.dev0 setup.py appends `.dev<N>` from `git rev-list --count v<ver>..HEAD` whenever git is available, which it is in the cibuildwheel container, so the previous run built onnxsim-0.7.3.dev0-*.whl. The publish job titles the release from the wheel metadata and would have shipped onnxsim-v0.7.3.dev0. Upstream's own tag builds set ONNXSIM_RELEASE for exactly this; mirror that.
1 parent b0ce0c3 commit 0a2d958

3 files changed

Lines changed: 248 additions & 0 deletions

File tree

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
# SPDX-FileCopyrightText: 2026 The RISE Project
2+
# SPDX-License-Identifier: MIT
3+
---
4+
# This workflow is based on: https://github.com/onnxsim/onnxsim/blob/v0.7.3/.github/workflows/build-and-test.yml
5+
name: Build onnxsim wheels (riscv64)
6+
7+
on:
8+
workflow_dispatch:
9+
inputs:
10+
version:
11+
description: 'Version glob to (re)build; empty builds every version of docs/packages/onnxsim.yaml not released yet'
12+
required: false
13+
default: ''
14+
pull_request:
15+
branches: [main]
16+
paths:
17+
- '.github/workflows/build-onnxsim.yml'
18+
- 'docs/packages/onnxsim.yaml'
19+
- 'patches/onnxsim/**'
20+
push:
21+
branches: [main]
22+
paths:
23+
- '.github/workflows/build-onnxsim.yml'
24+
- 'docs/packages/onnxsim.yaml'
25+
- 'patches/onnxsim/**'
26+
27+
concurrency:
28+
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
29+
cancel-in-progress: true
30+
31+
permissions:
32+
contents: read # to fetch code (actions/checkout)
33+
34+
env:
35+
MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64
36+
37+
jobs:
38+
setup:
39+
uses: $/.github/workflows/_setup.yml
40+
with:
41+
package: onnxsim
42+
version: ${{ inputs.version }}
43+
44+
build_wheels:
45+
needs: [setup]
46+
if: needs.setup.outputs.versions != '[]'
47+
name: Build onnxsim ${{ matrix.version }} ${{ matrix.python }}-manylinux_riscv64
48+
runs-on: ubuntu-24.04-riscv
49+
strategy:
50+
fail-fast: false
51+
matrix:
52+
version: ${{ fromJSON(needs.setup.outputs.versions) }}
53+
# Upstream ships cp310/cp311/cp312-abi3 (no free-threaded wheel here).
54+
# cp310 is dropped: onnx (the runtime dependency) has no riscv64 wheel
55+
# for it on our registry, at any version, and no py3-none-any fallback
56+
# either (it's a compiled extension). cp311 stays: onnx ships a
57+
# riscv64 cp311 wheel, and nanobind/protobuf (the other build-time
58+
# dependencies) resolve too, via their py3-none-any fallback wheels.
59+
# `python` is a real matrix dimension (not folded into `include`
60+
# alone) so both entries actually produce a job: an `include` list
61+
# whose entries share no key with the base matrix collapses onto a
62+
# single combination instead of adding one job per entry.
63+
python: [cp311, cp312]
64+
include:
65+
- python: cp311
66+
# No riscv64 onnxruntime wheel on cp311; the rest of the suite still
67+
# runs (onnxsim falls back to onnx's reference evaluator).
68+
onnxruntime: ''
69+
# onnx's reference BatchNormalization_9 (opset 9-13) always takes its
70+
# momentum branch (the attribute defaults to 0.9, never None) and mixes
71+
# batch statistics into the inference output, so the equivalence check
72+
# rejects the correctly fused Conv; same failure on x86_64 without
73+
# onnxruntime. Upstream CI always installs onnxruntime.
74+
pytest_k: not test_fuse_conv_bn_into_conv and not test_fuse_convtranspose_bn
75+
- python: cp312
76+
onnxruntime: onnxruntime
77+
pytest_k: ''
78+
79+
env:
80+
ONNXSIM_VERSION: ${{ matrix.version }}
81+
82+
steps:
83+
- name: Checkout onnxsim v${{ env.ONNXSIM_VERSION }}
84+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
85+
with:
86+
repository: onnxsim/onnxsim
87+
ref: v${{ env.ONNXSIM_VERSION }}
88+
submodules: recursive
89+
persist-credentials: false
90+
91+
- name: Checkout python-wheels
92+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
93+
with:
94+
path: python-wheels
95+
persist-credentials: false
96+
97+
- name: Apply patches
98+
run: git apply -v python-wheels/patches/onnxsim/${{ env.ONNXSIM_VERSION }}/*.patch
99+
100+
- name: Build wheels
101+
uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
102+
with:
103+
output-dir: wheelhouse/
104+
only: ${{ matrix.python }}-manylinux_riscv64
105+
env:
106+
# The riscv64 manylinux image's own cmake (3.31.8) already satisfies
107+
# CMakeLists.txt's cmake_minimum_required(3.22); upstream's own
108+
# CIBW_BEFORE_BUILD only pip-installs cmake/ninja for its manylinux_2_28
109+
# x86_64/aarch64 images.
110+
CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }}
111+
CIBW_ENVIRONMENT: >-
112+
CMAKE_ARGS="
113+
-DONNX_USE_PROTOBUF_SHARED_LIBS=OFF
114+
-DProtobuf_USE_STATIC_LIBS=ON
115+
-DONNX_USE_LITE_PROTO=ON
116+
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
117+
"
118+
ONNXSIM_RELEASE=${{ env.ONNXSIM_VERSION }}
119+
PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/
120+
# nanobind builds the onnxsim_cpp2py_export extension (CMakeLists.txt's
121+
# ONNXSIM_PYTHON path); CMake locates it via `python -m nanobind
122+
# --cmake_dir`, so it must already be importable before configure runs
123+
# or CMake falls back to fetching it from GitHub. protobuf is needed
124+
# for the same reason as onnxoptimizer's build. Both ship a
125+
# py3-none-any wheel, so they install on any interpreter/arch.
126+
CIBW_BEFORE_BUILD_LINUX: pip install nanobind protobuf
127+
# Upstream's own suite additionally exercises onnxscript/torch/timm/
128+
# sympy/onnxslim/ultralytics/rfdetr paths; most guard the import with
129+
# pytest.importorskip, so they collect fine and just skip without
130+
# riscv64 wheels for those. onnxruntime does have a riscv64 wheel on
131+
# our registry, but only from cp312 (matrix.onnxruntime). Five files
132+
# import torch/timm/onnxruntime unconditionally at module level
133+
# (no importorskip), which aborts collection outright rather than
134+
# skipping when the import fails - not just deselecting their tests,
135+
# so ignore the files themselves.
136+
CIBW_TEST_REQUIRES: pytest pytest-xdist ${{ matrix.onnxruntime }}
137+
CIBW_TEST_COMMAND: >-
138+
pytest {project}/tests/
139+
-k "${{ matrix.pytest_k }}"
140+
--ignore={project}/tests/test_python_api.py
141+
--ignore={project}/tests/test_simple.py
142+
--ignore={project}/tests/test_timm.py
143+
--ignore={project}/tests/test_rfdetr.py
144+
--ignore={project}/tests/test_yolo.py
145+
146+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
147+
with:
148+
name: onnxsim-${{ env.ONNXSIM_VERSION }}-${{ matrix.python }}-manylinux_riscv64
149+
path: wheelhouse/*.whl
150+
if-no-files-found: error
151+
152+
publish:
153+
name: Publish onnxsim ${{ matrix.version }}
154+
needs: [setup, build_wheels]
155+
if: needs.setup.outputs.versions != '[]'
156+
strategy:
157+
fail-fast: false
158+
matrix:
159+
version: ${{ fromJSON(needs.setup.outputs.versions) }}
160+
permissions:
161+
contents: write
162+
pull-requests: write
163+
uses: $/.github/workflows/_publish-wheel.yml
164+
secrets:
165+
app-private-key: ${{ secrets.RISEPROJECT_APP_PRIVATE_KEY }}
166+
with:
167+
artifact-pattern: onnxsim-${{ matrix.version }}-*-manylinux_riscv64

‎docs/packages/onnxsim.yaml‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package-name: onnxsim
2+
source-code: https://github.com/onnxsim/onnxsim
3+
license: MIT AND (Apache-2.0 OR BSD-2-Clause)
4+
warning: |
5+
onnxsim vendors onnx-optimizer as a git submodule, which in turn vendors
6+
onnx (MIT) as its own submodule; onnxsim links both, plus protobuf
7+
(BSD-3-Clause), statically. protobuf pulls in abseil-cpp (Apache-2.0) the
8+
same way onnx's own standalone build does (see docs/packages/onnx.yaml).
9+
Abseil ships no NOTICE file to propagate, and onnx-optimizer is
10+
Apache-2.0, so the wheel's own LICENSE already covers it. The Python
11+
extension is built with nanobind rather than pybind11; nanobind ships a
12+
single py3-none-any wheel with no compiled code of its own (it only
13+
emits code into the extension it builds), so it needs no riscv64-specific
14+
handling.
15+
versions:
16+
- version: 0.7.3
17+
patched: true
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Ludovic Henry <git@ludovic.dev>
3+
Date: Thu, 24 Sep 2026 00:00:00 +0000
4+
Subject: [PATCH] tests: pin ir_version in test_profiling's _foldable_model
5+
6+
Every other test file that builds an onnx.ModelProto by hand pins
7+
ir_version explicitly (test_python_api.py, test_function_rewriter.py,
8+
test_constant_fold_determinism.py, etc. all pass ir_version=... to
9+
helper.make_model()). test_profiling.py's _foldable_model() is the one
10+
holdout: it calls helper.make_model(graph, opset_imports=[...]) with no
11+
ir_version, so the model is stamped with whatever onnx.IR_VERSION the
12+
currently installed onnx package defines.
13+
14+
onnxsim statically links a vendored onnx (via the onnx-optimizer git
15+
submodule, frozen at a pinned commit) into its C++ core, and that
16+
core's checker enforces its own, older notion of the max supported IR
17+
version. Once the *installed* onnx package (an unpinned "onnx" runtime
18+
dependency in pyproject.toml) is newer than whatever onnx-optimizer's
19+
submodule was pinned to at release time, every one of
20+
_foldable_model()'s callers in this file fails identically:
21+
22+
RuntimeError: Your model ir_version 14 is higher than the
23+
checker's (13).
24+
25+
before reaching any of what the test actually means to check (the
26+
profiler's spans, the OrtSession nesting, the env var save/restore).
27+
This is a real ambient-versioning gap, not a riscv64-only symptom: the
28+
same break reproduces on any platform the moment pip resolves an onnx
29+
release newer than the vendored submodule tolerates, which is exactly
30+
why every sibling test file already pins ir_version defensively -
31+
test_profiling.py just missed doing the same for its one hand-built
32+
model.
33+
34+
Match the existing convention used throughout the suite (ir_version=10
35+
regardless of opset) so the fixture stays valid across the wide range
36+
of onnx versions the unpinned runtime dependency can resolve to.
37+
38+
Upstream-Status: To upstream [no push/issue access to onnxsim/onnxsim from this environment - only riseproject-dev/python-wheels is attached; the fix is a one-line ir_version pin matching every sibling test file's existing convention]
39+
40+
Signed-off-by: Ludovic Henry <git@ludovic.dev>
41+
---
42+
diff --git a/tests/test_profiling.py b/tests/test_profiling.py
43+
--- a/tests/test_profiling.py
44+
+++ b/tests/test_profiling.py
45+
@@ -29,7 +29,18 @@
46+
x = helper.make_tensor_value_info("x", TensorProto.FLOAT, [1, 4])
47+
y = helper.make_tensor_value_info("y", TensorProto.FLOAT, [1, 4])
48+
graph = helper.make_graph([add_const, add_x], "g", [x], [y], [a, b])
49+
- model = helper.make_model(graph, opset_imports=[helper.make_opsetid("", 17)])
50+
+ model = helper.make_model(
51+
+ graph,
52+
+ opset_imports=[helper.make_opsetid("", 17)],
53+
+ # Pin ir_version like every other model-building test in this suite
54+
+ # already does (test_python_api.py, test_function_rewriter.py, etc.):
55+
+ # onnx.helper.make_model() otherwise stamps the installed onnx package's
56+
+ # current onnx.IR_VERSION, which floats upward with each onnx release and
57+
+ # can exceed what the vendored onnx-optimizer/onnx submodule's checker
58+
+ # (frozen at a pinned commit) accepts, e.g. "Your model ir_version 14 is
59+
+ # higher than the checker's (13)" once a newer onnx is installed.
60+
+ ir_version=10,
61+
+ )
62+
onnx.checker.check_model(model)
63+
return model
64+

0 commit comments

Comments
 (0)