TinyML: veštačka inteligencija na malim pločama
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ča | Radna memorija (RAM) | Memorija za program (fleš) | Šta može |
|---|---|---|---|
| Arduino Uno | 2 KB | 32 KB | pravila i veoma mali modeli (prag, malo stablo) |
| micro:bit V2 | 128 KB | 512 KB | k-NN, mala stabla, male mreže (pokreti, zvukovi) |
| ESP32 | 520 KB | obično 4 MB | stabla, male neuronske mreže (pokreti, reči) |
| ESP32-S3 | 512 KB + često dodatnih 2–8 MB | obično 8–16 MB | prepoznavanje reči, jednostavno prepoznavanje slika sa kamere |
| laptop | 8–32 GB | stotine GB | veliki 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 radi | Cena |
|---|---|---|
| kvantizacija | težine iz float (4 bajta) u int8 (1 bajt) – model 4 puta manji | tačnost malo opadne |
| manje neurona i slojeva | manja mreža od početka | model može da bude manje tačan |
| odsecanje (pruning) | brišu se težine koje su skoro nula | složeniji postupak |
| bolje osobine | umesto 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đaj | Senzor | Model |
|---|---|---|
| prepoznavanje reči „uključi“ / „isključi“ | mikrofon | mala neuronska mreža nad zvukom |
| brojač ponavljanja u teretani | akcelerometar | k-NN ili mala mreža, kao micro:bit lekcija |
| zvono koje prepoznaje da li je pred vratima osoba ili mačka | kamera | konvoluciona mreža na ESP32-S3 |
| upozorenje da mašina „čudno“ vibrira | akcelerometar | model koji zna kako izgleda normalan rad |
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.
- Koliko težina ima mreža sa slojevima 64, 16 i 10? Koliko je to kilobajta kao float, a koliko kao int8?
- Za „pametno zvono“ koje prepoznaje lica ukućana – da li bi model radio u oblaku ili na uređaju? Navedi razloge.
- 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?
