Skip to main content

Extends the list of supported operators in onnx reference implementation and onnxruntime, or implements faster versions in C++.

Project description

https://github.com/sdpython/onnx-extended/raw/main/_doc/_static/logo.png

onnx-extended: extensions for onnx and onnxruntime

https://dev.azure.com/xavierdupre3/onnx-extended/_apis/build/status/sdpython.onnx-extended https://badge.fury.io/py/onnx-extended.svg GitHub Issues MIT License size https://img.shields.io/badge/code%20style-black-000000.svg

onnx-extended extends the list of supported operators in onnx reference implementation and onnxruntime, or implements faster versions in C++. Documentation onnx-extended. Source are available on github/onnx-extended.

Use a C++ implementation of existing operators

import timeit
import numpy as np
from onnx import TensorProto
from onnx.helper import (
    make_graph,
    make_model,
    make_node,
    make_opsetid,
    make_tensor_value_info,
)
from onnx.reference import ReferenceEvaluator
from onnxruntime import InferenceSession
from onnx_extended.ext_test_case import measure_time
from onnx_extended.reference import CReferenceEvaluator


X = make_tensor_value_info("X", TensorProto.FLOAT, [None, None, None, None])
Y = make_tensor_value_info("Y", TensorProto.FLOAT, [None, None, None, None])
B = make_tensor_value_info("B", TensorProto.FLOAT, [None, None, None, None])
W = make_tensor_value_info("W", TensorProto.FLOAT, [None, None, None, None])
node = make_node(
    "Conv",
    ["X", "W", "B"],
    ["Y"],
    pads=[1, 1, 1, 1],
    dilations=[1, 1],
    strides=[2, 2],
)
graph = make_graph([node], "g", [X, W, B], [Y])
onnx_model = make_model(graph, opset_imports=[make_opsetid("", 16)])

sH, sW = 64, 64
X = np.arange(sW * sH).reshape((1, 1, sH, sW)).astype(np.float32)
W = np.ones((1, 1, 3, 3), dtype=np.float32)
B = np.array([[[[0]]]], dtype=np.float32)

sess1 = ReferenceEvaluator(onnx_model)
sess2 = CReferenceEvaluator(onnx_model)  # 100 times faster

expected = sess1.run(None, {"X": X, "W": W, "B": B})[0]
got = sess2.run(None, {"X": X, "W": W, "B": B})[0]
diff = np.abs(expected - got).max()
print(f"difference: {diff}")

f1 = lambda: sess1.run(None, {"X": X, "W": W, "B": B})[0]
f2 = lambda: sess2.run(None, {"X": X, "W": W, "B": B})[0]
print("onnx:", timeit.timeit(f1, globals=globals(), number=5))
print("onnx-extended:", timeit.timeit(f2, globals=globals(), number=5))
difference: 0.0
onnx: 0.024006774998269975
onnx-extended: 0.0002316169993719086

Build with CUDA, openmp, eigen, onnxruntime

The package also contains some dummy examples on how to build with C++ functions (pybind11, cython), with openmp, eigen with or without CUDA. It also shows how to create a custom operator for onnxruntime in C++.

The version released on pypi/onnx-extended only works on CPU. It needs to be manually built to enable the code using CUDA. The build will automatically link with CUDA if it is found. If not, some extensions might not be available.

python setup.py build_ext --inplace
# pip install -e .

It is possible to use a specific version of CUDA:

python setup.py build_ext --inplace --cuda-version=11.8
# or (not working yet)
# pip install -e . --config-settings="--cuda-version=11.8"
# pip install -e . --global-option="--cuda-version=11.8"
export USE_CUDA=11.8
pip install -e .

NVTX can be enabled with the following command:

python setup.py build_ext --inplace --use_nvtx 1
# or (not working yet)
# pip install -e . --config-settings="--use_nvtx=1"
pip install -e . --global-option "--use_nvtx=1"

Experimental cython binding for onnxruntime

The python onnxruntime package relies on pybind11 to expose its functionalities. onnx-extended tries to build a cython wrapper around the C/C++ API of onnxruntime. cython relies on python C API and is faster than pybind11. This different may be significant when onnxruntime is used on small graphs and tensors.

Custom kernels for onnxruntime

onnxruntime provides an API to add custom implementation for existing or new onnx operators. An example for CPU.

from onnxruntime import InferenceSession, SessionOptions
from onnx_extended.ortops.optim.cpu import get_ort_ext_libs

r = get_ort_ext_libs()
opts = SessionOptions()
if r is not None:
    opts.register_custom_ops_library(r[0])

sess_cus = InferenceSession(
    onx_modified.SerializeToString(), opts, providers=["CPUExecutionProvider"]
)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

onnx-extended-0.2.4.tar.gz (5.4 MB view details)

Uploaded Source

Built Distributions

onnx_extended-0.2.4-cp311-cp311-win_amd64.whl (5.4 MB view details)

Uploaded CPython 3.11 Windows x86-64

onnx_extended-0.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (21.5 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

onnx_extended-0.2.4-cp310-cp310-win_amd64.whl (4.9 MB view details)

Uploaded CPython 3.10 Windows x86-64

onnx_extended-0.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (21.1 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

onnx_extended-0.2.4-cp310-cp310-macosx_10_15_x86_64.whl (39.0 MB view details)

Uploaded CPython 3.10 macOS 10.15+ x86-64

File details

Details for the file onnx-extended-0.2.4.tar.gz.

File metadata

  • Download URL: onnx-extended-0.2.4.tar.gz
  • Upload date:
  • Size: 5.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for onnx-extended-0.2.4.tar.gz
Algorithm Hash digest
SHA256 12dbc90b2c3ea1059405a98f2d2240f693aa16377553426691bff8f0c446d082
MD5 9548592b4a50ca515a1e8172d6915d50
BLAKE2b-256 3ad5fa89d405879655c563627812ac09cc74721535fafaca4c998ca5e6507b76

See more details on using hashes here.

File details

Details for the file onnx_extended-0.2.4-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for onnx_extended-0.2.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e1027ad886eb0dffca66a893c2817b7d8b2e56460bec966adc227d4b083903b0
MD5 d401578aeb4771d590e7170a9b3ecb8f
BLAKE2b-256 5bbec74a69639ce452aded5a5ec5a05ba265c49da940a69981d20eb68a30a5b4

See more details on using hashes here.

File details

Details for the file onnx_extended-0.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for onnx_extended-0.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 477beefd27ac5b0c97038cb11f53c6b4f0501c1ae324fdbc4f718783f06b50a6
MD5 7cd869dc341e93ac1b3e3682d6ad6a78
BLAKE2b-256 2144badf45b5853474e7e5f55c1091072eb19ab6c01c279f594f9e85d9789532

See more details on using hashes here.

File details

Details for the file onnx_extended-0.2.4-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for onnx_extended-0.2.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b6643f8e6714874db44c5b8975d7b7a5f34bba20bc774639eb9d86193549afc0
MD5 9e9872d6bb8f3e80567de6570c7da11c
BLAKE2b-256 c234fc0ae8dc2faf76406be277c1c6ce9a3c9947958be46a34e7a461369b5378

See more details on using hashes here.

File details

Details for the file onnx_extended-0.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for onnx_extended-0.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fe98eaa2ff63c5eb18ae6c3a0a9cb560a2069da913fecd245618c29b7064dbc8
MD5 8bed6f752736d9cb75a01f037a7ef9e5
BLAKE2b-256 fd8464e89a4b16a96766cdb3635b40c25e353219397899083072bab2378fc0e5

See more details on using hashes here.

File details

Details for the file onnx_extended-0.2.4-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for onnx_extended-0.2.4-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 b95f6676f424087daf858ea0e6c58a1a3f42e38b8add80934030fd2c9c83c067
MD5 38723d4dfe983f524669987f7cc9ec1c
BLAKE2b-256 e7b9a6c01e1b024e79121221f70eea30fd171a960c2d718161cb3598d33ec68a

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page