onnx-diagnostic: investigate onnx models

https://github.com/sdpython/onnx-diagnostic/actions/workflows/documentation.yml/badge.svg https://badge.fury.io/py/onnx-diagnostic.svg MIT License https://img.shields.io/badge/code%20style-black-000000.svg https://codecov.io/gh/sdpython/onnx-diagnostic/branch/main/graph/badge.svg?token=Wb9ZGDta8J

The main feature is about patches: it helps exporting pytorch models into ONNX, mostly designed for LLMs using dynamic caches. Sources available at github/onnx-diagnostic.

with torch_export_patches(patch_transformers=True) as f:
    ep = torch.export.export(model, args, kwargs=kwargs, dynamic_shapes=dynamic_shapes)
    # ...

It also implements tools to investigate, validate exported models (ExportedProgramm, ONNXProgram, …). onnx_diagnostic.torch_export_patches.torch_export_patches().

Getting started

git clone https://github.com/sdpython/onnx-diagnostic.git
cd onnx-diagnostic
pip install -e .

or

pip install onnx-diagnostic

Enlightening Examples

Where to start to export a model

Torch Export

Investigate ONNX models

Some Usefuls Tools

string_type

See onnx_diagnostic.helpers.string_type().

import torch
from onnx_diagnostic.helpers import string_type

inputs = (
    torch.rand((3, 4), dtype=torch.float16),
    [
        torch.rand((5, 6), dtype=torch.float16),
        torch.rand((5, 6, 7), dtype=torch.float16),
    ]
)

# with shapes
print(string_type(inputs, with_shape=True))
>>> (T10s3x4,#2[T10s5x6,T10s5x6x7])

onnx_dtype_name

See onnx_diagnostic.helpers.onnx_helper.onnx_dtype_name().

import onnx
from onnx_diagnostic.helpers.onnx_helper import onnx_dtype_name

itype = onnx.TensorProto.BFLOAT16
print(onnx_dtype_name(itype))
print(onnx_dtype_name(7))
>>> BFLOAT16
>>> INT64

max_diff

See onnx_diagnostic.helpers.max_diff().

import torch
from onnx_diagnostic.helpers import max_diff

print(
    max_diff(
        (torch.Tensor([1, 2]), (torch.Tensor([1, 2]),)),
        (torch.Tensor([1, 2]), (torch.Tensor([1, 2]),)),
    )
)
>>> {"abs": 0.0, "rel": 0.0, "sum": 0.0, "n": 4.0, "dnan": 0.0}s

guess_dynamic_shapes

See onnx_diagnostic.export.ModelInputs.guess_dynamic_shapes().

inputs = [
    (torch.randn((5, 6)), torch.randn((1, 6))),
    (torch.randn((7, 8)), torch.randn((1, 8))),
]
ds = ModelInputs(model, inputs).guess_dynamic_shapes(auto="dim")
print(ds)
>>> (({0: 'dim_0I0', 1: 'dim_0I1'}, {1: 'dim_1I1'}), {})

use_dyn_for_str

Older versions

The documentation was updated on:

    2025-05-14 18:07:03.651420

With the following versions:

    numpy: 2.2.5
    ml_dtypes: 0.5.1
    sklearn: 1.6.1
    onnx: 1.19.0
    onnxruntime: 1.23.0+cu126
    onnxscript: 0.3.0.dev20250301
    torch: 2.8.0.dev20250506+cu126
    transformers: 4.52.0.dev0
    timm: 1.0.15
    has_onnxruntime_training: True

Size of the package:

                              lines   chars
    ext dir                                
    .py                        1499   41888
        export                  954   29897
        helpers                4772  140066
        reference              1570   45236
        tasks                  1239   40524
        torch_export_patches   2000   68530
        torch_models           5524  279194
        torch_onnx              349   11213