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.
| 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 |
- Python
>=3.11 uv
Core install (includes timm, torch, typer, rich):
pip install timmxInstall 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 backendsTensorRT requires CUDA and must be installed separately:
pip install tensorrt # Linux/Windows with CUDA onlyNote: 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 doctoruv sync --extra onnx --extra coreml --extra ncnn --group dev
uv run timmx doctor
uv run timmx --helpuv run timmx export onnx resnet18 --pretrained --output ./artifacts/resnet18.onnxExport 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.onnxExported 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.onnxuv run timmx export coreml resnet18 \
--pretrained \
--convert-to mlprogram \
--compute-precision float16 \
--output ./artifacts/resnet18.mlpackageUsing 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.mlpackageFlexible batch size:
uv run timmx export coreml resnet18 \
--dynamic-batch \
--batch-size 2 \
--batch-upper-bound 8 \
--output ./artifacts/resnet18_dynamic.mlpackageSupported modes: fp32, fp16, dynamic-int8, int8.
uv run timmx export litert resnet18 \
--mode fp16 \
--output ./artifacts/resnet18_fp16.tfliteINT8 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.tfliteNHWC input layout:
uv run timmx export litert resnet18 \
--mode fp32 \
--nhwc-input \
--output ./artifacts/resnet18_nhwc.tfliteExports 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_ncnnExport without fp16 weight quantization:
uv run timmx export ncnn resnet18 \
--pretrained \
--no-fp16 \
--output ./artifacts/resnet18_ncnn_fp32Requires 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.engineINT8 with calibration:
uv run timmx export tensorrt resnet18 \
--pretrained \
--mode int8 \
--calibration-data ./calibration.pt \
--calibration-steps 8 \
--output ./artifacts/resnet18_int8.engineDynamic batch size:
uv run timmx export tensorrt resnet18 \
--pretrained \
--dynamic-batch \
--batch-size 4 \
--batch-min 1 \
--batch-max 32 \
--output ./artifacts/resnet18_dynamic.engineExport with XNNPack delegation (default, runs on CPU across all platforms):
uv run timmx export executorch resnet18 \
--pretrained \
--output ./artifacts/resnet18.pteCoreML delegation (macOS — targets Apple Neural Engine / GPU / CPU):
uv run timmx export executorch resnet18 \
--pretrained \
--delegate coreml \
--output ./artifacts/resnet18_coreml.pteCoreML 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.pteINT8 quantized with XNNPack:
uv run timmx export executorch resnet18 \
--pretrained \
--mode int8 \
--calibration-data ./calibration.pt \
--calibration-steps 8 \
--output ./artifacts/resnet18_int8.pteINT8 quantized with CoreML:
uv run timmx export executorch resnet18 \
--pretrained \
--delegate coreml \
--mode int8 \
--output ./artifacts/resnet18_coreml_int8.pteDynamic batch size:
uv run timmx export executorch resnet18 \
--pretrained \
--dynamic-batch \
--batch-size 2 \
--output ./artifacts/resnet18_dynamic.pteuv run timmx export torch-export resnet18 \
--pretrained \
--dynamic-batch \
--batch-size 2 \
--output ./artifacts/resnet18.pt2When using
--dynamic-batch, set--batch-sizeto at least2so PyTorch can capture a symbolic batch dimension.
uv run timmx export torchscript resnet18 \
--pretrained \
--output ./artifacts/resnet18.ptUse torch.jit.script instead of the default trace:
uv run timmx export torchscript resnet18 \
--pretrained \
--method script \
--output ./artifacts/resnet18_scripted.ptRun timmx doctor to check your installation and see which backends are available:
timmx doctorThis shows the timmx version, Python/torch versions, and a table of backend availability with install hints for any missing dependencies.
- 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
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 # buildSee CONTRIBUTING.md for a step-by-step guide on implementing and registering a new export backend.
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.