A simple tool to convert any IR format to ONNX file.
| Framework | Status |
|---|---|
| OpenVINO | ✅ |
| ONNXRuntime | ✅ |
| TensorRT | 🚧 |
| TensorRT-LLM | 🚧 |
- ✅: well supported
- 🪛: partially supported
- 🚧: developing
- Install from PyPI
pip install onnxifier- Convert IR using CLI
onnxify model.xmlusage: onnxify input_model.onnx [output_model.onnx]
onnxify command-line api
options:
-h, --help show this help message and exit
--install-completion [{bash,pwsh}]
install shell completion for the specified shell and
exit.
-a [ACTIVATE ...], --activate [ACTIVATE ...]
select passes to be activated, activate L1, L2 and L3
passes if not set.
-r [REMOVE ...], --remove [REMOVE ...]
specify passes to be removed from activated passes.
-n, --no-passes do not run any optimizing passes, just convert the
model
--print [PRINT] print the name of all optimizing passes
--format {protobuf,textproto,json,onnxtxt}
onnx file format
-s, --infer-shapes infer model shapes
-c CONFIG_FILE, --config-file CONFIG_FILE
specify a json-format config file for passes
-u, --uncheck no checking output model
--check check optimized model with random inputs
-d, --dry-run only run passes without saving the output model
--checker-backend {onnx,openvino,onnxruntime}
backend for accuracy checking, defaults to onnxruntime
-v OPSET_VERSION, --opset-version OPSET_VERSION
target opset version, defaults to 20
-vv [{DEBUG,INFO,WARNING,ERROR,CRITICAL}], --log-level [{DEBUG,INFO,WARNING,ERROR,CRITICAL}]
specify the level of log messages to be printed,
defaults to INFO
-R, --recursive recursively optimize nested functions
--nodes [NODES ...] specify a set of node names to apply passes only on
these nodes
To print pass information:
onnxify --print all
onnxify --print fuse_swish
onnxify --print l1onnxify provides tab-completion for Bash and PowerShell to help you quickly select pass names and options.
After installing onnxifier from PyPI, run the built-in installer once for your shell:
Bash
onnxify --install-completion bash
source ~/.bashrcPowerShell
onnxify --install-completion pwsh
. $PROFILEThe installer is idempotent — running it again will not duplicate entries in your profile.
Once enabled, you can use Tab to complete pass names after -a / -r / --print, for example:
# Complete a single pass
onnxify model.onnx -a ins<TAB>
# → inspect_sparsity_ratio inspect_weights_distribution insert_conv_before_act_shave
# Complete multiple space-separated passes
onnxify model.onnx -a infer_shape fold_const<TAB>
# → fold_constant
# Complete comma-separated passes
onnxify model.onnx -a fuse_gelu,ins<TAB>
# → fuse_gelu,inspect_sparsity_ratio ...
# Complete --print arguments
onnxify --print l<TAB>
# → l1 l2 l3ONNXifier supports shape inference for custom domain ops (e.g., trt::CausalConv1d, com.microsoft::MyOp) through a registration API.
Shape inference for domain ops is automatic when using the --infer-shapes flag:
onnxify model_with_trt_ops.onnx --infer-shapesDevelopers register shape inference using ONNXScript functions. The decorator inserts the function into the model during infer_shapes, then cleans it up afterward.
import onnxscript
from onnxscript.onnx_opset import opset19 as op
from onnxscript.values import Opset
from onnxifier.domain.shape_inference import register_shape_inference
@register_shape_inference("com.mycompany", "MyOp")
@onnxscript.script(Opset("com.mycompany", 1), default_opset=op)
def my_op_shape_infer(input_0, input_1):
# Return shapes for each output
return op.Identity(input_0), op.Identity(input_1)If domain/op_type are omitted, they are inferred from the ONNXScript function metadata:
@register_shape_inference() # Uses function.name and function.opset.domain
@onnxscript.script(Opset("com.mycompany", 1), default_opset=op)
def MyOp(input_0):
return op.Identity(input_0)See quickstart.md for detailed examples.
- pyright type checking
pip install -U pyright
pyright onnxifier
- mypy type checking
pip install -U mypy
mypy onnxifier --disable-error-code=import-untyped --disable-error=override --disable-error=call-overload
- pre-commit checking
pip install -U pre-commit
pre-commit run --all-files