TinyML: veštačka inteligencija na malim pločama

Modul 4 · Lekcija 5 od 5 · Veštačka inteligencija

U prethodnim lekcijama mali modeli – stablo i k-NN – radili su na ESP32 i micro:bit-u. A može li na ploču da stane i neuronska mreža koja prepoznaje reči ili slike? Ova oblast se zove TinyML (od engl. tiny – sićušan i machine learning – mašinsko učenje). U ovoj lekciji računamo koliko „pameti“ staje u mali čip i upoznajemo alate koji se koriste.

Koliko memorije imaju naši čipovi

PločaRadna memorija (RAM)Memorija za program (fleš)Šta može
Arduino Uno2 KB32 KBpravila i veoma mali modeli (prag, malo stablo)
micro:bit V2128 KB512 KBk-NN, mala stabla, male mreže (pokreti, zvukovi)
ESP32520 KBobično 4 MBstabla, male neuronske mreže (pokreti, reči)
ESP32-S3512 KB + često dodatnih 2–8 MBobično 8–16 MBprepoznavanje reči, jednostavno prepoznavanje slika sa kamere
laptop8–32 GBstotine GBveliki modeli, trening

Laptop ima stotinama hiljada puta više memorije od micro:bit-a. Zato se modeli treniraju na računaru, a na mali čip se prenose gotovi i „smanjeni“.

Računamo: koliko je velika mreža

Svaka veza između dva neurona ima težinu, a svaki neuron i prag. Za slojeve sa a i b neurona to je a · b + b brojeva. Decimalni broj (float) zauzima 4 bajta; ako ga „smanjimo“ na ceo broj od –128 do 127 (int8), zauzima 1 bajt.

# Koliko memorije zauzima model? Računamo broj težina neuronske mreže
def broj_tezina(slojevi):
    """slojevi: broj neurona u svakom sloju, npr. [64, 64, 10]."""
    ukupno = 0
    for ulaz, izlaz in zip(slojevi, slojevi[1:]):
        ukupno += ulaz * izlaz + izlaz        # težine + po jedan prag za svaki neuron
    return ukupno


mreze = {
    "naša mreža za cifre (64-64-10)": [64, 64, 10],
    "mreža za slike 96 × 96 (9216-128-10)": [96 * 96, 128, 10],
    "veća mreža (9216-512-256-10)": [96 * 96, 512, 256, 10],
}
cipovi = {"Arduino Uno": 2, "micro:bit V2": 128, "ESP32": 520}     # radna memorija (RAM) u KB

for ime, slojevi in mreze.items():
    n = broj_tezina(slojevi)
    kb_float = n * 4 / 1024        # decimalni broj (float) zauzima 4 bajta
    kb_int8 = n * 1 / 1024         # „smanjen“ model: jedan bajt po težini
    print(f"{ime}: {n} težina = {kb_float:.0f} KB (float) ili {kb_int8:.0f} KB (int8)")
    for cip, ram in cipovi.items():
        print(f"    {cip:12} ({ram:3} KB RAM): {'staje' if kb_int8 < ram * 0.7 else 'NE staje'}")

Ispis programa:

naša mreža za cifre (64-64-10): 4810 težina = 19 KB (float) ili 5 KB (int8)
    Arduino Uno  (  2 KB RAM): NE staje
    micro:bit V2 (128 KB RAM): staje
    ESP32        (520 KB RAM): staje
mreža za slike 96 × 96 (9216-128-10): 1181066 težina = 4614 KB (float) ili 1153 KB (int8)
    Arduino Uno  (  2 KB RAM): NE staje
    micro:bit V2 (128 KB RAM): NE staje
    ESP32        (520 KB RAM): NE staje
veća mreža (9216-512-256-10): 4853002 težina = 18957 KB (float) ili 4739 KB (int8)
    Arduino Uno  (  2 KB RAM): NE staje
    micro:bit V2 (128 KB RAM): NE staje
    ESP32        (520 KB RAM): NE staje
  • Naša mreža za cifre iz modula 3 ima 4810 težina – staje i na micro:bit V2 i na ESP32.
  • Obična mreža za slike 96 × 96 piksela je prevelika. Zato se za slike koriste posebne konvolucione mreže, koje istu malu grupu težina „prevlače“ preko cele slike – imaju mnogo manje težina, pa mogu da stanu na ESP32-S3.
  • Ovaj račun je pojednostavljen: težine mogu da se drže u fleš memoriji, a RAM-u trebaju i međurezultati. Ali pokazuje ključnu stvar – broj težina odlučuje da li model staje.

Kako se model „smanjuje“

PostupakŠta radiCena
kvantizacijatežine iz float (4 bajta) u int8 (1 bajt) – model 4 puta manjitačnost malo opadne
manje neurona i slojevamanja mreža od početkamodel može da bude manje tačan
odsecanje (pruning)brišu se težine koje su skoro nulasloženiji postupak
bolje osobineumesto sirovih podataka, model dobija pametno izabrane brojeve (kao rasipanje kod micro:bit-a)treba znati šta je važno

Alati koji se koriste

  • TensorFlow Lite for Microcontrollers (Google; biblioteka je od 2024. deo projekta koji se zove LiteRT) – pokreće male neuronske mreže na mikrokontrolerima, uključujući ESP32. Mreža se trenira u Pythonu, pa se pretvori u niz bajtova koji se ubaci u program.
  • Edge Impulse – sajt na kome se snimaju podaci sa ploče ili telefona, trenira model i dobija gotova biblioteka za Arduino IDE. Traži nalog (za učenike – uz nastavnika i roditelje).
  • ESP-DL i ESP-SR (Espressif) – biblioteke za prepoznavanje lica, predmeta i glasovnih komandi na čipovima ESP32-S3.
  • micro:bit CreateAI – prepoznavanje pokreta na micro:bit-u, bez programiranja.

Za školu je najlakši put: početi sa stablima i k-NN (kao u ovom modulu), pa tek onda preći na alate za neuronske mreže.

Primeri TinyML uređaja

UređajSenzorModel
prepoznavanje reči „uključi“ / „isključi“mikrofonmala neuronska mreža nad zvukom
brojač ponavljanja u teretaniakcelerometark-NN ili mala mreža, kao micro:bit lekcija
zvono koje prepoznaje da li je pred vratima osoba ili mačkakamerakonvoluciona mreža na ESP32-S3
upozorenje da mašina „čudno“ vibriraakcelerometarmodel koji zna kako izgleda normalan rad
Za čas (nastavnicima): trajanje 30 minuta; pribor: kalkulator ili računar.
Učenici računaju broj težina za nekoliko mreža (zadatak 1) i odlučuju na koju ploču bi stala. Zatim u grupama osmišljavaju TinyML uređaj za školu.

Česte zablude

  • „TinyML je isto što i četbot na ploči“ – veliki jezički modeli imaju milijarde težina i ne staju na mikrokontroler; TinyML su mali modeli za jedan zadatak.
  • „Model na čipu se trenira na čipu“ – skoro uvek se trenira na računaru, a na čip se prenosi gotov.

Zadaci za vežbu

Pokušaj prvo sam, pa tek onda otvori rešenje.

  1. Koliko težina ima mreža sa slojevima 64, 16 i 10? Koliko je to kilobajta kao float, a koliko kao int8?
  2. Za „pametno zvono“ koje prepoznaje lica ukućana – da li bi model radio u oblaku ili na uređaju? Navedi razloge.
  3. Zašto se modeli skoro uvek treniraju na računaru, a ne na mikrokontroleru?
Rešenje 1: račun

64 · 16 + 16 = 1040 i 16 · 10 + 10 = 170, ukupno 1210 težina. Kao float: 1210 · 4 = 4840 bajtova ≈ 4,7 KB; kao int8: 1210 bajtova ≈ 1,2 KB.

Rešenje 2: jedan mogući odgovor

Bolje na uređaju (npr. ESP32-S3 sa kamerom): fotografije lica su lični podaci i bolje je da ne napuštaju kuću, a zvono treba da radi i kada nema interneta. Mana: model mora da bude mali, pa može češće da greši – zato je dobro da ukućani mogu i ručno da otključaju.

Rešenje 3: objašnjenje

Trening traži mnogo memorije (svi primeri, međurezultati) i mnogo računanja, a mikrokontroler ima malo RAM-a i spor procesor. Korišćenje gotovog modela je mnogo lakše: samo nekoliko množenja i sabiranja po merenju.

Šta dalje

Završio si modul AI i Internet stvari. Sledi modul AI i društvo, koji počinje lekcijom Da li veštačka inteligencija ima svest? U njemu razgovaramo o velikim pitanjima: da li veštačka inteligencija misli, kako da bude poštena i bezbedna i kakva je njena budućnost.

Proveri znanje

Otvori kviz

Kviz: TinyML

1. Koliko težina ima mreža sa slojevima 4, 3 i 2?




2. Šta radi kvantizacija?




3. Gde se TinyML modeli obično treniraju?




4. Koja ploča ima najviše radne memorije?