Source code for trtutils.inspect._onnx
# Copyright (c) 2025 Justin Davis (davisjustin302@gmail.com)
#
# MIT License
# mypy: disable-error-code="import-untyped"
from __future__ import annotations
from typing import TYPE_CHECKING
from trtutils._log import LOG
from trtutils.builder._dla import can_run_on_dla
from trtutils.builder._onnx import read_onnx
from trtutils.compat._libs import trt
from ._tensor import get_tensor_size
from ._types import LayerInfo
if TYPE_CHECKING:
from pathlib import Path
[docs]
def inspect_onnx_layers(
onnx: trt.INetworkDefinition | Path | str,
config: trt.IBuilderConfig | None = None,
*,
verbose: bool | None = None,
) -> list[LayerInfo]:
"""
Inspect the layers that TensorRT would create from an ONNX model.
Returns detailed per-layer information including tensor sizes, precision,
and DLA compatibility. On non-DLA systems, ``dla_compatible`` is always
``False``.
Parameters
----------
onnx : Path | str | trt.INetworkDefinition
Path to the ONNX model or an already constructed TensorRT network.
config : trt.IBuilderConfig | None, optional
The TensorRT builder config. Required if ``onnx`` is a pre-built
network and DLA compatibility checking is desired.
verbose : bool | None, optional
When True, logs detailed layer information.
Returns
-------
list[LayerInfo]
Per-layer information.
Raises
------
ValueError
If ``onnx`` is a network and ``config`` is not provided.
"""
if isinstance(onnx, trt.INetworkDefinition):
if config is None:
err_msg = "Config must be provided when onnx is a network"
raise ValueError(err_msg)
network = onnx
else:
network, _, config, _ = read_onnx(onnx)
# Get DLA compatibility
_, chunks = can_run_on_dla(network, config, verbose_layers=False, verbose_chunks=False)
# Build a set of DLA-compatible layer indices
dla_layer_indices: set[int] = set()
for _layer_list, start, end, on_dla in chunks:
if on_dla:
for idx in range(start, end + 1):
dla_layer_indices.add(idx)
layers: list[LayerInfo] = []
for idx in range(network.num_layers):
trt_layer = network.get_layer(idx)
# Get layer type as string
layer_type = str(trt_layer.type).split(".")[-1]
# Calculate output tensor size
output_size = 0
for out_idx in range(trt_layer.num_outputs):
output = trt_layer.get_output(out_idx)
if output is not None:
output_size += get_tensor_size(output)
# Calculate input tensor size
input_size = 0
for in_idx in range(trt_layer.num_inputs):
inp = trt_layer.get_input(in_idx)
if inp is not None:
input_size += get_tensor_size(inp)
layer = LayerInfo(
index=idx,
name=trt_layer.name,
layer_type=layer_type,
precision=trt_layer.precision,
input_tensor_size=input_size,
output_tensor_size=output_size,
dla_compatible=idx in dla_layer_indices,
)
layers.append(layer)
if verbose:
LOG.info(f"Layer {idx}: {layer}")
return layers