TICO (Torch IR to Circle ONE) is a python library for converting Pytorch modules into a circle model that is a lightweight and efficient representation in ONE designed for optimized on-device neural network inference.
- Prerequisites
- Python 3.10
- one-compiler nightly
- This project depends on ONE Compiler, and it uses nightly features that are not yet available in the official release. Until one-compiler 1.30.0 is released, you must use a prebuilt nighlty version of ONE Compiler.
We highly recommend to use a virtual env, e.g., conda.
-
Clone this repo
-
Build python package
./ccex build
This will generate build
and dist
directories in the root directory.
- Install generated package
./ccex install
Available options
--dist
To install the package from .whl (without this option, TICO is installed in an editable mode)--torch_ver <torch version>
To install a specific torch version (default: 2.6).- Available : 2.5, 2.6, nightly
- Now you can convert a torch module to a
.circle
.
This tutorial explains how you can use TICO to generate a circle model from a torch module.
Let's assume we have a torch module.
import tico
import torch
class AddModule(torch.nn.Module):
def __init__(self):
super().__init__()
def forward(self, x, y):
return x + y
NOTE TICO internally uses torch.export. Therefore, the torch module must be 'export'able. Please see this document if you have any trouble to export.
You can convert a torch module to a circle model with these steps.
torch_module = AddModule()
example_inputs = (torch.ones(4), torch.ones(4))
circle_model = tico.convert(torch_module, example_inputs)
circle_model.save('add.circle')
Compile with configuration
from test.modules.op.add import AddWithCausalMaskFolded
torch_module = AddWithCausalMaskFolded()
example_inputs = torch_module.get_example_inputs()
config = tico.CompileConfigV1()
config.legalize_causal_mask_value = True
circle_model = tico.convert(torch_module, example_inputs, config = config)
circle_model.save('add_causal_mask_m120.circle')
With legalize_causal_mask_value
option on, causal mask value is converted from
-inf to -120, creating a more quantization-friendly circle model with the cost of
slight accuracy drop.
The torch module can be exported and saved as .pt2
file (from PyTorch 2.1).
module = AddModule()
example_inputs = (torch.ones(4), torch.ones(4))
exported_program = torch.export.export(module, example_inputs)
torch.export.save(exported_program, 'add.pt2')
There are two ways to convert .pt2
file: python api, command line tool.
- Python API
circle_model = tico.convert_from_pt2('add.pt2')
circle_model.save('add.circle')
- Command Line Tool
pt2-to-circle -i add.pt2 -o add.circle
- Command Line Tool with configuration
pt2-to-circle -i add.pt2 -o add.circle -c config.yaml
# config.yaml
version: '1.0' # You must specify the config version.
legalize_causal_mask_value: True
After circle export, you can run the model directly in Python.
Note that you should install one-compiler package first.
The output types are numpy.ndarray.
torch_module = AddModule()
example_inputs = (torch.ones(4), torch.ones(4))
circle_model = tico.convert(torch_module, example_inputs)
circle_model(*example_inputs)
# numpy.ndarray([2., 2., 2., 2.], dtype=float32)
Run below commands to configure testing or formatting environment.
Refer to the dedicated section to have more fine-grained control.
$ ./ccex configure # to set up testing & formatting environment
$ ./ccex configure format # to set up only formatting environment
$ ./ccex configure test # to set up only testing environment
Available options
--torch_ver <torch version>
To install a specific torch family package(ex. torchvision) version (default: 2.6)- Available : '2.5', '2.6', 'nightly'
$ ./ccex configure # to set up testing & formatting environment with stable2.6.x version
$ ./ccex configure test # to set up only testing environment with stable 2.6.x version
$ ./ccex configure test --torch_ver 2.5 # to set up only testing environment with stable 2.5.x version
$ ./ccex configure test --torch_ver nightly # to set up only testing environment with nightly version
Run below commands to install requirements for testing.
NOTE TICO
will be installed in an editable mode.
./ccex configure test
# without editable install
./ccex configure test --dist
Run below commands to run the all unit tests.
NOTE Unit tests don't include model test.
./ccex test
# OR
./ccex test run-all-tests
To run subset of test.modules.*
,
Run ./ccex test -k <keyword>
For example, to run tests in specific sub-directory (op, net, ..)
# To run tests in specific sub-directory (op/, net/ ..)
./ccex test -k op
./ccex test -k net
# To run tests in one file (single/op/add, single/op/sub, ...)
./ccex test -k add
./ccex test -k sub
# To run SimpleAdd test in test/modules/single/op/add.py
./ccex test -k SimpleAdd
To see the full debug log, add -v
or TICO_LOG=4
.
TICO_LOG=4 ./ccex test -k add
# OR
./ccex test -v -k add
If you want to test them locally, you can do so by navigating to each model directory,
installing the dependencies listed in its requirements.txt
, and running the tests one by one.
$ pip install -r test/modules/model/<model_name>/requirements.txt
# Run test for a single model
$ ./ccex test -m <model_name>
For example, to run a single model
./ccex test -m InceptionV3
Run below commands to install requirements for formatting.
./ccex configure format
./ccex format