View Source Changelog
v0.4.0-rc1 (2026-08-19)
Browse the Repository | Released Assets
A release candidate. Everything here is new surface rather than changed behaviour, but
it is a lot of it at once, so it is worth a look before it becomes 0.4.0. Depend on it
explicitly -- a pre-release is not picked up by a requirement like "~> 0.3".
Added
Signature runners. A model's signatures could be listed with
interpreter:signature_keys/1andget_signature_defs/1, but there was no way to run one, so tensors still had to be addressed by index and the order of a model's outputs guessed at.tflite_beam_interpreter:get_signature_runner/2now returns a runner, andtflite_beam_signature_runnerdrives it: names and counts of its inputs and outputs, reading and writing them by name, resizing them, allocating, invoking and cancelling.Passing
nilas the key asks for the primary subgraph, which works on models that declare no signatures at all, so this is usable with older exports too.A runner belongs to the interpreter that handed it out and holds a reference to it, so it stays usable even after the interpreter's own term is collected. Like the interpreter it is not safe to use from several processes at once.
tflite_beam_interpreter:enable_cancellation/1andcancel/1. An invocation runs on a dirty scheduler and could not be interrupted;cancel/1does not block and is safe to call from another process, so a long inference can now be given up on. Withoutenable_cancellation/1beforehand, cancelling is an error.tflite_beam_interpreter:release_non_persistent_memory/1, which hands back the memory that is only needed while invoking. Invoking again reallocates it, trading time for memory on devices short of the latter.tflite_beam_interpreter:reset_variable_tensors/1, resetting all of a model's variable tensors. Only a single-tensor version existed.tflite_beam_interpreter:get_allow_fp16_precision_for_fp32/1andset_allow_fp16_precision_for_fp32/2.tflite_beam_interpreter:signature_inputs/2,signature_outputs/2,get_subgraph_index_from_signature/2andsubgraphs_size/1, which describe a model's signatures and subgraphs without having to build a runner.tflite_beam_interpreter:resize_input_tensor/3andresize_input_tensor_strict/3. Input shapes could not be changed at all before, so a model with a variable dimension could only ever be fed whatever shape it was exported with. Callallocate_tensors/1again afterwards. The strict variant only touches dimensions the model left unknown.tflite_beam_flatbuffer_model:verify_and_build_from_buffer/1,2. A verifying counterpart existed for files but not for buffers, so a model already in memory could only be built unchecked.
Fixed
- The
minimum_runtimefield of thetflite_beam_flatbuffer_modelrecord held a boolean. Three of the four places that fill the record askedflatbuffer_model_initializedfor it, so anyone reading the field to decide whether a runtime is new enough was readingtrue. - Building a model from a buffer no longer leaks the copy of that buffer when the model turns out not to parse.
v0.3.12 (2026-08-19)
Browse the Repository | Released Assets
Fixed
- Interpreters, interpreter builders and the resources they borrow (the op resolver and the flatbuffer model) now hold real references to each other. Previously only a hand-rolled counter recorded the link, so the VM was free to collect a resource that was still in use, and the destructor's decrement landed in whatever resource had been given that memory next. On arm64 this brought down the emulator with SIGBUS.
- Resources are no longer read uninitialised.
enif_alloc_resourcehands back raw memory, so fields that looked initialised in the struct definition were not, andNifResTfLiteTensorcould reachdeleteon a wild pointer. - Every
tflite::FlatBufferModeland everytflite::Interpreterwas leaked; both are now released with the resource that owns them. - Creating an Edge TPU interpreter no longer leaks its resource when the interpreter cannot be built or its tensors cannot be allocated.
- Tensor resources are no longer leaked. Each one was created with a reference that nobody ever gave back, on top of the one the interpreter's cache holds, so none of them could be freed. Failing partway through reading a tensor leaked one as well.
- Edge TPU context resources are no longer leaked, for the same reason: the reference
from
enif_alloc_resourcewas never released. allocate_tensorsno longer reportsunknown errorfor three of the statuses TFLite can return. A model carrying ops the interpreter cannot resolve -- an Edge TPU model given to a plain builtin resolver, say -- now saysUnresolvedOpsinstead. The mapping lived in two places, one of which had drifted; there is now only one.- The Edge TPU itself is handed back when nothing is using it any more. Contexts were
parked in a global map that was written to and never read, purely so their
shared_ptrcould not run out, which held the device until the VM exited. Each context resource now owns its share directly, and an Edge TPU interpreter holds a reference to the context it delegates to, so the device outlives every interpreter built on it and is released once the last one is gone.
v0.3.11 (2026-08-15)
Browse the Repository | Released Assets
Fixed
- Platform-specific binaries now go to the consuming app's
_build/<target>_<env>/lib/tflite_beam/privinstead ofdeps/tflite_beam/priv, so switchingMIX_TARGETno longer picks up another target'stflite_beam.so.rm -rf deps/tflite_beamis no longer needed when cross-compiling (#73). - Building from source no longer fails on hosts that have gflags installed
system-wide (e.g.
brew install gflags). glog resolved gflags throughfind_package, which picked up the system copy and collided with the targets the bundled gflags had already defined.
v0.3.10 (2026-06-30)
Browse the Repository | Released Assets
Changed
- [deps] Use libedgetpu v0.1.14.
- Use tensorflow v2.21.0.
v0.3.9 (2025-04-03)
Browse the Repository | Released Assets
Changed
- [deps] Use libedgetpu v0.1.12.
- Use tensorflow v2.19.0.
v0.3.8 (2025-02-10)
Browse the Repository | Released Assets
Changed
- [deps] Use libedgetpu v0.1.10.
- Use tensorflow v2.18.0.
v0.3.7 (2024-09-03)
Browse the Repository | Released Assets
Fixed
- fixed project build directory
v0.3.6 (2024-03-17)
Browse the Repository | Released Assets
Changed
- [deps] Use libedgetpu v0.1.9.
- Use tensorflow v2.16.1.
- Use libusb v1.0.27.
- Use Erlang/OTP 25.x for precompiled binaries. This unified the required Erlang/OTP NIF version to
2.16for precompiled binaries. - Detect and use
HTTP_PROXY,HTTPS_PROXY,http_proxyandhttps_proxywhen fetch preocmpiled binary from GitHub.
v0.3.5 (2024-01-24)
Browse the Repository | Released Assets
Changed
- Precompiled version for armv6 devices.
- Removed
TFBEAM_XNNPACK_ENABLE_ARM_I8MMoption as it should work as long as a newer C compiler is used. - Updated metadata_schema to 1.5.0
v0.3.4 (2024-01-23)
Browse the Repository | Released Assets
Changed
- [deps] Use libedgetpu v0.1.8.
- Use tensorflow v2.15.0.
v0.3.3 (2023-07-21)
Browse the Repository | Released Assets
Changed
- [deps] Use libedgetpu v0.1.7.
- Use tensorflow v2.13.0.
v0.3.2 (2023-04-03)
Browse the Repository | Released Assets
Fixed
- [precompiled-nerves] Guess correct
TARGET_ARCHfromTARGET_CPU.
v0.3.1 (2023-04-03)
Browse the Repository | Released Assets
Fixed
- [deps] Use libedgetpu v0.1.6.
Changed
- [examples] Examples moved to cocoa-xu/tflite_elixir.
v0.3.0 (2023-04-02)
Browse the Repository | Released Assets
Breaking Change
- This repo will now be the TensorFlow Lite Erlang bindings. For Elixir bindings, please visit cocoa-xu/tflite_elixir.
Fixed
- [erlang] Generate correct error message from a list of errors.
- [c_src] Initialize resource pointers with
nullptr. - Implemented tokenizers for MobileBERT (#57) by @cocoa-xu.
- [make] Ensure priv dir exist.
v0.2.1 (2023-04-02)
Browse the Repository | Released Assets
Changed
- [deps] Use TensorFlow Lite version 2.11.1.
Fixed
- [erlang] Generate correct error message from a list of errors.
- [c_src] Initialize resource pointers with
nullptr. - Implemented tokenizers for MobileBERT (#57) by @cocoa-xu.
- [make] Ensure priv dir exist.
v0.2.0 (2023-03-30)
Browse the Repository | Released Assets
Breaking Changes
- Renamed root namespace from
TFLiteElixirtoTFLiteBEAM
Changes
bufferwill be copied and managed when usingTFLiteBEAM.FlatBufferModel.build_from_buffer/1.TFLiteBEAM.TFLiteTensor.dims/1returns a list (following TensorFlow Lite's C++ API convention) whileTFLiteBEAM.TFLiteTensor.shape/1returns a tuple (folllowingnx's convention.)
Added
Erlang support.
[example] added pose estimation example (#43) by @mnishiguchi
[example] use thunder model instead of lightning in pose estimation (#45) by @mnishiguchi
[example] added audio classification example
Experimental high-level module
TFLiteBEAM.ImageClassification.iex> alias TFLiteBEAM.ImageClassification iex> {:ok, pid} = ImageClassification.start("test/test_data/mobilenet_v2_1.0_224_inat_bird_quant.tflite") iex> ImageClassification.predict(pid, "test/test_data/parrot.jpeg") %{class_id: 923, score: 0.70703125} iex> ImageClassification.set_label_from_associated_file(pid, "inat_bird_labels.txt") :ok iex> ImageClassification.predict(pid, "test/test_data/parrot.jpeg") %{class_id: 923, label: "Ara macao (Scarlet Macaw)", score: 0.70703125} iex> ImageClassification.predict(pid, "test/test_data/parrot.jpeg", top_k: 3) [ %{class_id: 923, label: "Ara macao (Scarlet Macaw)", score: 0.70703125}, %{ class_id: 837, label: "Platycercus elegans (Crimson Rosella)", score: 0.078125 }, %{ class_id: 245, label: "Coracias caudatus (Lilac-breasted Roller)", score: 0.01953125 } ]
v0.1.7 (2023-03-22)
Browse the Repository | Released Assets
Breaking Changes
- Deprecated
TFLiteElixir.Interpreter.allocate_tensors!/1 - Deprecated Access behaviour for
TFLiteElixir.FlatBufferModel
Fixed
Properly implemented
TFLiteElixir.FlatBufferModel.read_all_metadata/1.iex> filename = Path.join([__DIR__, "test", "test_data", "mobilenet_v2_1.0_224_inat_bird_quant.tflite"]) iex> %FlatBufferModel{} = model = FlatBufferModel.build_from_buffer(File.read!(filename)) iex> TFLiteElixir.FlatBufferModel.read_all_metadata(model) %{ TFLITE_METADATA: %{ description: "Identify the most prominent object in the image from a known set of categories.", min_parser_version: "1.0.0", name: "ImageClassifier", subgraph_metadata: [ %{ input_tensor_metadata: [ %{ content: %{ content_properties: %{color_space: "RGB"}, content_properties_type: "ImageProperties" }, description: "Input image to be classified.", name: "image", process_units: [ %{ options: %{mean: [127.5], std: [127.5]}, options_type: "NormalizationOptions" } ], stats: %{max: [255.0], min: [0.0]} } ], output_tensor_metadata: [ %{ associated_files: [ %{ description: "Labels for categories that the model can recognize.", name: "inat_bird_labels.txt", type: "TENSOR_AXIS_LABELS" } ], description: "Probabilities of the labels respectively.", name: "probability", stats: %{max: [255.0], min: [0.0]} } ] } ] }, min_runtime_version: "1.5.0" }
Changed
- Improve
TFLiteElixir.TFLiteTensor.to_nx/2(#33) by @cocoa-xu - [doc] Improve doc for to_nx (#31) by @mnishiguchi
Added
- Implemented
FlatBufferModel.{list_associated_files/1,get_associated_file/2}TFLiteElixir.Interpreter.signature_keys/1TFLiteElixir.Interpreter.execution_plan/1TFLiteElixir.Interpreter.new_from_buffer/1TFLiteElixir.Interpreter.tensors_size/1TFLiteElixir.Interpreter.variables/1TFLiteElixir.Interpreter.set_variables/2TFLiteElixir.Interpreter.set_inputs/2TFLiteElixir.Interpreter.set_outputs/2
- [example] object detection example (#40) by @mnishiguchi
v0.1.6 (2023-03-19)
Browse the Repository | Released Assets
Fixed
- [edgetpu] Improved edgetpu context handling, and bumped libedgetpu_runtime_version to v0.1.5. Fixed #30
Added
- [example] artistic-style-transfer example (#27) @mnishiguchi
v0.1.5 (2023-03-18)
Browse the Repository | Released Assets
Breaking Changes
- Deprecated functions:
TFLiteElixir.FlatBufferModel.initialized!/1TFLiteElixir.FlatBufferModel.get_minimum_runtime!/1TFLiteElixir.TFLiteTensor.tensor!TFLiteElixir.TFLiteTensor.to_nx!TFLiteElixir.TFLiteTensor.to_binary!TFLiteElixir.FlatBufferModel.build_from_buffer!TFLiteElixir.FlatBufferModel.get_full_signature_list
TFLiteElixir.Coral.get_edge_tpu_context/1now takes keyword options.
Changes
- [example] Improve Inference on TPU notebook (#15) @mnishiguchi
- [example] Improve Inference on TPU notebook (#16) @mnishiguchi
- Alias modules in tflite_interpreter (#17) @mnishiguchi
- Rename elixir files based on module names (#18) @mnishiguchi
- add moduledocs (#19) @mnishiguchi
Fixed
- Fixed a few places that could lead to segmentation fault.
- [example] Fixed broken ESRGAN link, Visualize the result section in the "Super Resolution" notebook. Lock down
tflite_elixirandevisionversion (#29) @mnishiguchi. - [typespec] Fixed typespec for
TFLiteElixir.Coral.edge_tpu_devices/0(#22) @mnishiguchi.
Added
- [test] Unit tests for
TFLiteElixir.Interpreter,TFLiteElixir.InterpreterBuilderandTFLiteElixir.Ops.Builtin.BuiltinResolver. - [example] Added intro text to super_resolution_example. (#26) @mnishiguchi.
TFLiteElixir.FlatBufferModel.error_reporter/1.TFLiteElixir.FlatBufferModel.verify_and_build_from_file/2
v0.1.4 (2023-03-14)
Browse the Repository | Released Assets
Breaking Changes
- Snake case functions (#21) @mnishiguchi
Changes
- [example] Improve Inference on TPU notebook (#15) @mnishiguchi
- [example] Improve Inference on TPU notebook (#16) @mnishiguchi
- Alias modules in tflite_interpreter (#17) @mnishiguchi
- Rename elixir files based on module names (#18) @mnishiguchi
- add moduledocs (#19) @mnishiguchi
Fixed
- Fix compilation logic when not using precompiled binaries.
Added
- Implemented
TFLiteElixir.reset_variable_tensor/1. - Add support for armv6.
Misc
- Simple workaround for cortex-a53 and cortex-a57,
vcvtaq_s32_f32.
v0.1.3 (2023-03-09)
Browse the Repository | Released Assets
Changes
- Bump TFLite version to v2.11.0.
v0.1.2 (2023-03-08)
Browse the Repository | Released Assets
First release on hex.pm.