Extensible CLI and Python package for exporting timm models.
Project description
timmx
An extensible CLI and Python package for exporting timm models to various deployment formats. Born out of having too many one-off export scripts for fine-tuned timm models — timmx unifies them behind a single command-line interface with a plugin-based backend system.
Supported Formats
| Format | Command | Output |
|---|---|---|
| ONNX | timmx export onnx |
.onnx |
| Core ML | timmx export coreml |
.mlpackage / .mlmodel |
| LiteRT / TFLite | timmx export litert |
.tflite |
| ncnn | timmx export ncnn |
directory (.param + .bin) |
| TensorRT | timmx export tensorrt |
.engine |
| ExecuTorch | timmx export executorch |
.pte |
| torch.export | timmx export torch-export |
.pt2 |
| TorchScript | timmx export torchscript |
.pt |
Requirements
- Python
>=3.11 uv
Installation
Core install (includes timm, torch, typer, rich):
pip install timmx
Install with specific backend extras:
pip install 'timmx[onnx]' # ONNX export
pip install 'timmx[coreml]' # Core ML export
pip install 'timmx[litert]' # LiteRT/TFLite export
pip install 'timmx[ncnn]' # ncnn export (via pnnx)
pip install 'timmx[executorch]' # ExecuTorch export (XNNPack, CoreML delegates)
pip install 'timmx[onnx,coreml]' # multiple backends
TensorRT requires CUDA and must be installed separately:
pip install tensorrt # Linux/Windows with CUDA only
Note: The
executorchandlitertextras have conflicting torch version requirements (executorchneedstorch>=2.10.0,litertneedstorch<2.10.0) and cannot be installed in the same environment.
Check which backends are available:
timmx doctor
Quick Start
uv sync --extra onnx --extra coreml --extra ncnn --group dev
uv run timmx doctor
uv run timmx --help
Usage Examples
ONNX
uv run timmx export onnx resnet18 --pretrained --output ./artifacts/resnet18.onnx
Export a fine-tuned checkpoint with dynamic batching:
uv run timmx export onnx resnet18 \
--checkpoint ./checkpoints/model.pth \
--input-size 3 224 224 \
--dynamic-batch \
--output ./artifacts/resnet18_finetuned.onnx
Exported models are automatically optimized with onnxslim (constant folding, dead-code elimination, operator fusion). To skip optimization:
uv run timmx export onnx resnet18 --pretrained --no-slim --output ./artifacts/resnet18.onnx
Core ML
uv run timmx export coreml resnet18 \
--pretrained \
--convert-to mlprogram \
--compute-precision float16 \
--output ./artifacts/resnet18.mlpackage
Using torch.export as source (beta):
uv run timmx export coreml resnet18 \
--pretrained \
--source torch-export \
--convert-to mlprogram \
--compute-precision float16 \
--output ./artifacts/resnet18_te.mlpackage
Flexible batch size:
uv run timmx export coreml resnet18 \
--dynamic-batch \
--batch-size 2 \
--batch-upper-bound 8 \
--output ./artifacts/resnet18_dynamic.mlpackage
LiteRT / TFLite
Supported modes: fp32, fp16, dynamic-int8, int8.
uv run timmx export litert resnet18 \
--mode fp16 \
--output ./artifacts/resnet18_fp16.tflite
INT8 with calibration data:
# generate a calibration tensor
uv run python -c "import torch; torch.save(torch.randn(64, 3, 224, 224), 'calibration.pt')"
uv run timmx export litert resnet18 \
--mode int8 \
--calibration-data ./calibration.pt \
--calibration-steps 8 \
--output ./artifacts/resnet18_int8.tflite
NHWC input layout:
uv run timmx export litert resnet18 \
--mode fp32 \
--nhwc-input \
--output ./artifacts/resnet18_nhwc.tflite
ncnn
Exports via pnnx and writes a deployment-ready ncnn model directory containing model.ncnn.param, model.ncnn.bin, and model_ncnn.py. pnnx intermediate files are removed automatically.
uv run timmx export ncnn resnet18 \
--pretrained \
--output ./artifacts/resnet18_ncnn
Export without fp16 weight quantization:
uv run timmx export ncnn resnet18 \
--pretrained \
--no-fp16 \
--output ./artifacts/resnet18_ncnn_fp32
TensorRT
Requires an NVIDIA GPU with CUDA and the tensorrt package (pip install tensorrt).
uv run timmx export tensorrt resnet18 \
--pretrained \
--mode fp16 \
--output ./artifacts/resnet18_fp16.engine
INT8 with calibration:
uv run timmx export tensorrt resnet18 \
--pretrained \
--mode int8 \
--calibration-data ./calibration.pt \
--calibration-steps 8 \
--output ./artifacts/resnet18_int8.engine
Dynamic batch size:
uv run timmx export tensorrt resnet18 \
--pretrained \
--dynamic-batch \
--batch-size 4 \
--batch-min 1 \
--batch-max 32 \
--output ./artifacts/resnet18_dynamic.engine
ExecuTorch
Export with XNNPack delegation (default, runs on CPU across all platforms):
uv run timmx export executorch resnet18 \
--pretrained \
--output ./artifacts/resnet18.pte
CoreML delegation (macOS — targets Apple Neural Engine / GPU / CPU):
uv run timmx export executorch resnet18 \
--pretrained \
--delegate coreml \
--output ./artifacts/resnet18_coreml.pte
CoreML with explicit fp32 compute precision (default is fp16):
uv run timmx export executorch resnet18 \
--pretrained \
--delegate coreml \
--compute-precision float32 \
--output ./artifacts/resnet18_coreml_fp32.pte
INT8 quantized with XNNPack:
uv run timmx export executorch resnet18 \
--pretrained \
--mode int8 \
--calibration-data ./calibration.pt \
--calibration-steps 8 \
--output ./artifacts/resnet18_int8.pte
INT8 quantized with CoreML:
uv run timmx export executorch resnet18 \
--pretrained \
--delegate coreml \
--mode int8 \
--output ./artifacts/resnet18_coreml_int8.pte
Dynamic batch size:
uv run timmx export executorch resnet18 \
--pretrained \
--dynamic-batch \
--batch-size 2 \
--output ./artifacts/resnet18_dynamic.pte
torch.export
uv run timmx export torch-export resnet18 \
--pretrained \
--dynamic-batch \
--batch-size 2 \
--output ./artifacts/resnet18.pt2
When using
--dynamic-batch, set--batch-sizeto at least2so PyTorch can capture a symbolic batch dimension.
TorchScript
uv run timmx export torchscript resnet18 \
--pretrained \
--output ./artifacts/resnet18.pt
Use torch.jit.script instead of the default trace:
uv run timmx export torchscript resnet18 \
--pretrained \
--method script \
--output ./artifacts/resnet18_scripted.pt
Diagnostics
Run timmx doctor to check your installation and see which backends are available:
timmx doctor
This shows the timmx version, Python/torch versions, and a table of backend availability with install hints for any missing dependencies.
Roadmap
- ONNX
- Core ML
- LiteRT / TFLite
- ncnn
- torch.export
- TensorRT
- TorchScript
- ExecuTorch (XNNPack + CoreML delegates)
- OpenVINO
- TensorFlow (SavedModel / .pb)
- TensorFlow.js
- TFLite Edge TPU
- RKNN
- MNN
- PaddlePaddle
Development
uv sync --extra onnx --extra coreml --extra ncnn --group dev # install extras + pytest
uvx ruff format . # format
uvx ruff check . # lint
uv run pytest # test
uv build # build
Adding a New Backend
See CONTRIBUTING.md for a step-by-step guide on implementing and registering a new export backend.
AI Disclaimer
This project is developed with the assistance of AI tools. The original export logic comes from various standalone scripts I wrote for exporting fine-tuned timm models to different deployment formats. The process of consolidating these scripts into a unified CLI tool has been aided by AI, with my oversight at every step, reviewing generated code, manually fixing issues during backend porting, and validating that exports produce correct results.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file timmx-0.2.1.tar.gz.
File metadata
- Download URL: timmx-0.2.1.tar.gz
- Upload date:
- Size: 17.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.6 {"installer":{"name":"uv","version":"0.10.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fecfe3ce55f0a9e0b4557614bb465b762a864e501c1e69705bd79b7541a59533
|
|
| MD5 |
e64b4fdc9210f7d92d681860f7b6d556
|
|
| BLAKE2b-256 |
739b9aac7ed936db48d5dad55c58f19add896cc7a3f0f2510aacb9fa6dc34ead
|
File details
Details for the file timmx-0.2.1-py3-none-any.whl.
File metadata
- Download URL: timmx-0.2.1-py3-none-any.whl
- Upload date:
- Size: 28.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.6 {"installer":{"name":"uv","version":"0.10.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dcf0c40ab9b8b6e6c0e5b3b823524b8eed7a40eb29d371e3eb9041ac966b8567
|
|
| MD5 |
f9912d5c8dbc66f7be4a265c12826f60
|
|
| BLAKE2b-256 |
442d9811d489297f48b4dc3cab28bfaa20bb62b22f86abb4b8cdfefe74f60b2e
|