Skip to content

MicroPythonNexus/emlearn-micropython

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

51 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DOI

emlearn-micropython

Micropython integration for the emlearn Machine Learning library for microcontrollers.

The goal is to enable applications to run ML inference on the microcontroller, without having to touch any C code.

Status

Minimally useful

  • Can perform classification with RandomForest/DecisionTree models
  • Installable as a MicroPython native module. No rebuild/flashing needed
  • Models can be loaded at runtime from a .CSV file in disk/flash
  • Pre-built modules are available for the most common architectures/devices
  • Has been tested on armv6m (RP2040) and x64 (Unix port)

Prerequisites

Minimally you will need

  • Python 3.10+ on host
  • MicroPython running onto your device

Download repository

Download the repository with examples etc

git clone https://github.com/emlearn/emlearn-micropython

Installing from a release

Find architecture

Identify which CPU architecture your device uses. You need to specify ARCH to install the correct module version.

ARCH Description Examples
x64 x86 64 bit PC
x86 x86 32 bit
armv6m ARM Thumb (1) Cortex-M0
armv7m ARM Thumb 2 Cortex-M3
armv7emsp ARM Thumb 2, single float Cortex-M4F, Cortex-M7
armv7emdp ARM Thumb 2, double floats Cortex-M7
xtensa non-windowed ESP8266
xtensawin windowed with window size 8 ESP32

Download release files

Download from releases.

Install on device

Copy the .mpy file for the correct ARCH to your device.

mpremote cp emltrees-$ARCH.mpy :emltrees.mpy

NOTE: If there is no ready-made build for your device/architecture, then you will need to build the .mpy module yourself.

Usage

NOTE: Make sure to install the module first.

Train a model with scikit-learn

pip install emlearn scikit-learn
python examples/xor_train.py

Copy model file to device

mpremote cp xor_model.csv :xor_model.csv

Run program that uses the model

mpremote run examples/xor_run.py

Benchmarks

UCI handwriting digits

UCI ML hand-written digits datasets dataset from sklearn.datasets.load_digits. 8x8 image, 64 features. Values are 4-bit integers (16 levels). 10 classes.

Running with a very simple RandomForest, 7 trees. Reaches approx 86% accuracy. Tested on Raspberry PI Pico, with RP2040 microcontroller (ARM Cortex M0 @ 133 MHz).

Inferences per second

NOTE: over half of the time for emlearn case, is spent on converting the Python lists of integers into a float array. Removing that bottleneck would speed up things considerably.

Developing locally

Prerequisites

These come in addition to the prequisites described above.

Make sure you have the dependencies needed to build for your platform. See MicroPython: Building native modules.

We assume that micropython is installed in the same place as this repository. If using another location, adjust MPY_DIR accordingly.

Build

Build the .mpy native module

make -C eml_trees/ ARCH=x64 MPY_DIR=../../micropython

Install it on device

mpremote cp emltrees/emltrees.mpy :emltrees.mpy

Run tests

TODO: implement and document

Citations

If you use emlearn-micropython in an academic work, please reference it using:

@misc{emlearn_micropython,
  author       = {Jon Nordby},
  title        = {{emlearn-micropython: Efficient Machine Learning engine for MicroPython}},
  month        = aug,
  year         = 2023,
  doi          = {10.5281/zenodo.8212731},
  url          = {https://doi.org/10.5281/zenodo.8212731}
}

About

Efficient Machine Learning engine for MicroPython

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Jupyter Notebook 60.0%
  • C 20.8%
  • Python 13.5%
  • Makefile 5.5%
  • Shell 0.2%