Tflite micro integration
Use when integrating or debugging TensorFlow Lite Micro (LiteRT) on MCUs — op resolver, tensor arena sizing, AllocateTensors, Invoke, int8 quantization, and missing-op errorsFrom its SKILL.md
npx -y skills add easyzoom/aix-skills --skill tflite-micro-integrationAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 24 stars24 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
5.0 KB, ~1.3k tokens by cl100k_base, as published. Nobody here has run it
TensorFlow Lite Micro Integration
Overview
Use this skill to bring up TensorFlow Lite for Microcontrollers (TFLM / LiteRT for Microcontrollers) on an MCU: register exactly the ops the model uses, size the tensor_arena correctly, and quantize inputs so Invoke() returns valid output. Most failures are missing ops, an undersized arena, or unquantized input, not model logic. TFLM is Google's official microcontroller runtime and is integrated by several vendor toolchains — Espressif esp-tflite-micro (with ESP-NN kernels), NXP eIQ, and ST X-CUBE-AI, where TFLM is available as an optional runtime alongside ST's own proprietary Cube.AI runtime. Use tinymaix-integration instead when you want a lighter, dependency-free runtime.
When To Use
Use this skill when:
- The user runs
tensorflow/tflite-microand works withtflite::MicroInterpreter,tflite::MicroMutableOpResolver,AllocateTensors(), orInvoke(). - The build or runtime hits
Didn't find op for builtin opcode 'CONV_2D','QUANTIZE', arena/AllocateTensorsfailures, or output that is all zeros or drifting. - The project embeds a
.tflitemodel as a C array (xxd -i) and needs int8scale/zero_pointhandling.
Do not use this skill when the model is not yet converted and quantized to .tflite; run the TFLite converter and validate on the host first.
First Questions
Ask for:
- Target core, RAM/flash, and toolchain; whether CMSIS-NN / ESP-NN / vendor kernels are used.
- The
.tflitemodel, its op list (from Netron orflatc), and its input/output dtype (int8,uint8, orfloat32). - Current
kTensorArenaSizeand whetherAllocateTensors()returnskTfLiteOk. - Input
scale/zero_pointand expected output; a known golden input/output pair. - Exact symptom: link error, missing-op error, allocation failure, or wrong output.
Integration Checklist
-
Convert and embed the model. Produce a quantized
.tflite, thenxxd -i model.tflite > model.cc. Reference it viatflite::GetModel(g_model)and checkmodel->version() != TFLITE_SCHEMA_VERSION. -
Register only the needed ops. Use
tflite::MicroMutableOpResolver<N>whereNmatches the exact count ofAddConv2D(),AddDepthwiseConv2D(),AddFullyConnected(),AddReshape(),AddSoftmax(),AddQuantize(), etc.AllOpsResolver(which registers all built-in ops) bloats flash; avoid it in production. -
Allocate the tensor arena. Declare
alignas(16) uint8_t tensor_arena[kTensorArenaSize];, constructtflite::MicroInterpreterwith the model, resolver,tensor_arena, andkTensorArenaSize, then useMicroPrintffor logging. -
Allocate tensors and check the code. Call
interpreter.AllocateTensors()and confirm it returnskTfLiteOk. GrowkTensorArenaSizeif it fails, then trim towardinterpreter.arena_used_bytes(). -
Quantize the input. Read
input->params.scaleandinput->params.zero_point, computeq = round(real / scale) + zero_point, clamp to[-128, 127], and writeinput->data.int8[i]. -
Invoke and dequantize. Check
interpreter.Invoke() == kTfLiteOk, then convertoutput->data.int8[i]back withreal = (q - zero_point) * scale.
Common Failures
Didn't find op for builtin opcode 'CONV_2D'/'QUANTIZE': op missing from the resolver, orNinMicroMutableOpResolver<N>too small to hold allAdd*calls.- Opcode version mismatch (same message with
version 'N'plus "An older version of this builtin might be supported"): model exported by a newer converter than the runtime; rebuildtflite-microor re-export. AllocateTensors()fails or returns non-kTfLiteOkbecausekTensorArenaSizeis too small.- Output is all zeros or drifts: input written as raw floats/pixels without applying
scale/zero_point. - Hard fault or stack overflow inside
AllocateTensors()/Invoke(): give the calling thread enough stack (typically several KB). - Unaligned or too-small
tensor_arena(missingalignas(16)) causing allocation errors.
Verification
Before claiming TFLM inference works:
- State the model, its op list, input/output dtype, and
kTensorArenaSizevsarena_used_bytes(). - Confirm
AllocateTensors()andInvoke()both returnkTfLiteOk. - Confirm a golden input reproduces the host reference output within quantization tolerance.
- Confirm input quantization and output dequantization use the tensor's actual
scale/zero_point.
Example
User:
TFLM 里 Invoke 报 "Didn't find op for builtin opcode 'DEPTHWISE_CONV_2D'"。
Agent:
- Asks for the model op list (Netron/
flatc) and the currentMicroMutableOpResolver<N>registrations. - Adds
resolver.AddDepthwiseConv2D()and bumpsNto match the totalAdd*count. - Re-runs, confirms
AllocateTensors()andInvoke()returnkTfLiteOk, and checks a golden vector.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.