ShrinkRay
HandBrake for TinyML — one tool that takes any small model and produces a chip-ready artifact, with a report proving it fits.
📖 New here? Read the full user guide — installation, every command, and troubleshooting.
ShrinkRay compresses/quantizes small neural networks for microcontrollers and tells you — before you touch a firmware build — whether the result fits your target chip's flash and RAM.
- ✅ FITS / ⚠️ TIGHT / ❌ TOO BIG verdict per chip
- Keras/TFLite → int8/int16/float TFLite + C byte array (
.cc/.h) for LiteRT-M / CMSIS-NN - scikit-learn → single portable C99 header (via emlearn; works even on ATmega328P)
- ONNX →
.espdlvia ESP-PPQ (optional extra) - Self-contained
report.md+report.htmlafter every conversion - 100% local: no network calls, no telemetry, no account
Demo
30-second quickstart
pip install shrinkray-cli
shrinkray chips # the 12-chip database
shrinkray inspect model.keras # params, size, ops, FLOPs
shrinkray convert model.keras --target esp32s3 --method int8 --data cal.npy
Output:
wrote outputs/model_int8.tflite (2.7 KiB)
wrote outputs/model_int8.cc
wrote outputs/model_int8.h
accuracy max-abs-error 0.002717, top-1 agreement 100.0%
esp32s3: ✅ FITS — flash 2.7 KiB / 8192.0 KiB (0.0%), est. RAM 0.1 KiB / 512.0 KiB (0.0%)
wrote outputs/report.md
wrote outputs/report.html
--data cal.npy is a small float32 array of representative samples
(numpy.save("cal.npy", x[:100].astype("float32"))). With it you get
full-integer quantization and an accuracy-delta check; without it, int8
falls back to dynamic-range quantization.
Commands
| Command | What it does |
|---|---|
shrinkray inspect <model> |
Format, parameter count, file size, operator histogram, FLOP estimate for .keras / .h5 / .tflite / .onnx / .pkl |
shrinkray chips [--chips extra.json] |
Print the chip database; merge your own chips from JSON |
shrinkray convert <model> --target <chip> |
Convert + fit verdict + reports |
Useful convert flags:
| Flag | Meaning |
|---|---|
--method int8|int16|float|inline |
int16 needs --data; inline is for scikit-learn .pkl |
--data cal.npy |
Calibration samples (full-integer quant + accuracy check) |
--out DIR |
Output directory (default: outputs/) |
--all-chips |
Fit-check against the whole database, ranked by headroom (always exits 0) |
--chips mychips.json |
Merge custom chip definitions |
Exit codes: 0 ok · 1 model error · 2 missing optional dependency ·
3 converted but doesn't fit the target.
Config file
Drop a shrinkray.toml in your project directory to stop repeating flags
(CLI flags always win over the file):
[defaults]
target = "esp32s3"
data = "cal.npy"
out = "build"
Chip database
Ships with 12 chips: esp32, esp32s3, esp32p4, stm32f407, stm32h743, stm32u575, nrf52840, nrf5340, rp2040, rp2350, nano33ble, atmega328p. Each entry: flash KiB, SRAM KiB, clock MHz, feature flags (dsp / simd / ai-instructions), preferred runtime (litert-m / cmsis-nn / esp-dl / emlearn).
Extend it with your own JSON (--chips mychips.json; your entries override
built-ins on name collision):
{"chips": [{"name": "myboard", "flash_kb": 512, "sram_kb": 128,
"clock_mhz": 100, "features": ["dsp"], "runtime": "cmsis-nn"}]}
Fit model
- Flash = actual artifact bytes measured on disk.
- Peak RAM = tensor-liveness analysis of the TFLite graph: the largest sum of concurrently live activation tensors × 1.2 safety factor.
- Verdicts: FITS = flash ≤ 90% and RAM ≤ 70%; TIGHT = flash ≤ 100% and RAM ≤ 90%; otherwise TOO BIG.
Install matrix
On PyPI the package is
shrinkray-cli(the nameshrinkraywas already taken by an unrelated project). The command it installs is stillshrinkray.
| Method | Command | Notes |
|---|---|---|
| pip (Win/Linux/macOS) | pip install shrinkray-cli |
Python 3.10–3.12, CPU-only is fine |
| pip + ESP-DL pipeline | pip install shrinkray-cli[espdl] |
adds ESP-PPQ (heavier deps) |
| pipx | pipx install shrinkray-cli |
isolated CLI install |
| Standalone binary | GitHub Releases | experimental; bundles TF, so it's big — pip is recommended |
| winget / brew | planned | not published yet |
Honest limitations (v0.1)
- No GUI, no training — input is an already-trained model ≤ ~100 MB.
- Pipeline A (Keras→TFLite) requires TensorFlow (CPU build is fine). Everything else — TFLite inspect, sklearn pipeline, chips, reports — works without it.
- RAM estimates are heuristics, not measurements: TFLite liveness ×1.2 for Pipeline A; not estimable for emlearn C code (reported as n/a).
- Quantizing an already-
.tflitefile is not supported — pass the original.keras/.h5(or use--method floatto repackage as a C array). - Pipeline C requires
pip install shrinkray-cli[espdl]; without it the command prints install instructions and exits 2 — everything else keeps working. - No ONNX Runtime quantization, no RISC-V paths, no model zoo (v0.2+).
Development
pip install -e ".[dev]"
pytest --cov=shrinkray.core --cov=shrinkray.pipelines # coverage gate: 80%
CI runs pytest on Windows / Ubuntu / macOS × Python 3.10 / 3.11 / 3.12
(.github/workflows/test.yml); tag pushes build standalone binaries
(.github/workflows/release.yml).
Test fixtures (tiny Keras net, sklearn forest, ONNX graph) are generated at runtime — no binary models in the repo.
License
GNU Affero General Public License v3.0 (AGPL-3.0-only) — see LICENSE.
Free for everyone to use, study, and modify — including commercial internal use. If you distribute ShrinkRay or a modified version, or offer it as a network service, you must share your source under the same license. Commercial closed-source licensing is available on request; contact the maintainer.
Metadata
Release files for shrinkray-cli 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| shrinkray_cli-0.1.0.tar.gz | 61.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| shrinkray_cli-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 108.6 kB
Release files / shrinkray_cli-0.1.0.tar.gz
| Download URL | shrinkray_cli-0.1.0.tar.gz |
|---|---|
| Size | 61.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c13fa79393fa8b2601841dbd28092d83889b946251014d3ca1834a09a62183ac
|
|
BLAKE2b-256 checksum How to use checksums |
67f623d1d4b2dbf27133d8af63214b65f75b6f794c3b957ade16d1b0c3e7d6a6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|
Release files / shrinkray_cli-0.1.0-py3-none-any.whl
| Download URL | shrinkray_cli-0.1.0-py3-none-any.whl |
|---|---|
| Size | 47.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bece8c6218d89f79021fe13573a835a75beb2ca7eed8b1a13a40983af909e49c
|
|
BLAKE2b-256 checksum How to use checksums |
80f1ec9fda875cc7c96abbdf74d2af2e5bed8e70a8d6d8fef61ede09ec6a3581
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|