From 7a30f37ffa488f7d9425dbb4070e63c49571a110 Mon Sep 17 00:00:00 2001 From: Justin Chu Date: Tue, 23 Apr 2024 11:31:38 -0700 Subject: [PATCH] [IR] Create readme (#1437) Initial readme for the IR. Describes the file structure. --- onnxscript/ir/README.md | 21 +++++++++++++++++++++ onnxscript/ir/_linked_list.py | 1 + 2 files changed, 22 insertions(+) create mode 100644 onnxscript/ir/README.md diff --git a/onnxscript/ir/README.md b/onnxscript/ir/README.md new file mode 100644 index 000000000..6299d6f4d --- /dev/null +++ b/onnxscript/ir/README.md @@ -0,0 +1,21 @@ +# ONNX IR + +An in-memory IR that supports the full ONNX spec, designed for graph construction, analysis and transformation. + +## Features ✨ + +- Full ONNX spec support: all valid models representable by ONNX protobuf, and a subset of invalid models (so you can load and fix them). +- Low memory footprint: mmap'ed external tensors; unified interface for ONNX TensorProto, Numpy arrays and PyTorch Tensors etc. No tensor size limitation. Zero copies. +- Straightforward access patterns: Access value information and traverse the graph topology at ease. +- Robust mutation: Create as many iterators as you like on the graph while mutating it. +- Speed: Performant graph manipulation, serialization/deserialization to Protobuf. +- Pythonic and familiar APIs: Classes define Pythonic apis and still map to ONNX protobuf concepts in an intuitive way. + +## Code Organization 🗺️ + +- [`_protocols.py`](_protocols.py): Interfaces defined for all entities in the IR. +- [`_core.py`](_core.py): Implementation of the core entities in the IR, including `Model`, `Graph`, `Node`, `Value`, and others. +- [`_enums.py`](_enums.py): Definition of the type enums that correspond to the `DataType` and `AttributeType` in `onnx.proto`. +- [`_name_authority.py`](_name_authority.py): The authority for giving names to entities in the graph, used internally. +- [`_linked_list.py`](_linked_list.py): The data structure as the node container in the graph that supports robust iteration and mutation. Internal. +- [`_metadata.py`](_metadata.py): Metadata store for all entities in the IR. diff --git a/onnxscript/ir/_linked_list.py b/onnxscript/ir/_linked_list.py index de38c25f4..059a88f2b 100644 --- a/onnxscript/ir/_linked_list.py +++ b/onnxscript/ir/_linked_list.py @@ -96,6 +96,7 @@ class DoublyLinkedSet(Generic[T], Sequence[T]): def __init__(self, values: Iterable[T] | None = None) -> None: # Using the root node simplifies the mutation implementation a lot + # The list is circular. The root node is the only node that is not a part of the list values root_ = _LinkBox(self, None) self._root: _LinkBox = root_ self._length = 0