14.2.2.2. ROMFS-levykuvan rakentaminen

ROMFS-levykuva on flash-muistissa sijaitseva, vain luettava tiedostojärjestelmä, jonka suoritusympäristö liittää automaattisesti polkuun /rom. Se ratkaisee resurssiongelman, johon edellinen sivu päättyi: koneoppimismallien tiedostot, luokkanimitaulukot, JSON-konfiguraatio, kuvamallit – mikä tahansa, jonka sovellus avaa ja lukee mutta jota se ei koskaan kirjoita, kulkee mukana käännökseen maksamatta Python-literaaleina upottamisen hintaa.

Kolme asiaa tekee ROMFS:stä oikean työkalun toimitettaville resursseille:

  • Tiedostojärjestelmä on osa laiteohjelmiston levykuvaa. Loppukäyttäjät eivät voi poistaa tiedostoa polusta /rom, muokata sellaista tai korvata sitä omallaan.

  • Polussa /rom olevat tiedostot ovat käytettävissä paikan päällä. Kuluttajat kuten mallitiedoston lataava ml-moduuli saavat suoran näkymän flash-muistiin ilman RAM-kopiota – usean megatavun malli polussa /rom ”latautuu” käytännössä ilmaiseksi, kun taas sama tiedosto polussa /sdcard luetaan RAM-muistiin latausaikana ja jää sinne viittauksen elinajaksi. Tavallinen open() + read kopioi tarpeen mukaan: jokainen read(n)-kutsu kopioi n tavua flash-muistista RAM-muistiin kutsun hetkellä, ja paljas read() pyytää koko tiedostoa.

  • /rom ja /rom/lib lisätään polkuun sys.path käynnistyksessä. Levykuvaan pudotetut Python-paketit ovat tuotavissa nimen perusteella; kutsupaikalla ei tarvita mitään erityistä.

14.2.2.2.1. Levykuvan rakentaminen

ROMFS-levykuvat luodaan, muokataan ja flashataan IDE:n kautta. Käytä sitä totuuden lähteenä jokaisen toimitettavan ROMFS-osion sisällölle.

Syy miksi tällä on merkitystä: mallitiedostoilla on kohdistusvaatimuksia, jotka suoritusaikainen lataaja pakottaa. .tflite-tiedostot on täytettävä 16 tavun rajoihin, ja N6:n NPU vaatii käännetyille malleille 32 tavun kohdistuksen. IDE soveltaa tämän täytön automaattisesti kirjoittaessaan levykuvaa. Työkalut, jotka käyvät läpi lähdepuun soveltamatta täyttöä – erityisesti mpremote romfs – tuottavat levykuvan, joka liittyy puhtaasti mutta jonka mallit epäonnistuvat ensimmäisellä päättelykutsulla.

IDE:n ROMFS-editori on interaktiivinen näkymä levykuvan sisältöön. Tiedostoja ja kansioita voi lisätä, nimetä uudelleen ja poistaa muistissa; tallentaminen kirjoittaa tuloksen ulos .img-tiedostona, joka on valmis flashattavaksi. Tyypillinen rakenne sovellukselle, joka toimittaa mallin sekä joitakin resursseja ja Python-paketin, näyttää tältä:

model.tflite
labels.txt
config.json
templates/
    calibration.jpg
lib/
    mylib/
        __init__.py
        helpers.py

Vihje

Sekä IDE että mpremote ristikääntävät .py-tiedostot .mpy-tavukoodiksi ROMFS-levykuvaan vietäessä, joten kamera tuo ne maksamatta jäsennyskustannusta latausaikana. Editorissa lähdetiedostot pysyvät .py-muodossa; levykuva sisältää .mpy-tiedostoja.

Kun levykuva on flashattu, puu näkyy MicroPythonista polussa /rom/

>>> import os
>>> os.listdir('/rom')
['model.tflite', 'labels.txt', 'config.json', 'templates', 'lib']
>>> import mylib
>>> mylib.helpers
<module 'mylib.helpers' from '/rom/lib/mylib/helpers.mpy'>

14.2.2.2.2. Suurin osa sovelluksesta sijaitsee ROMFS:ssä

ROMFS on oikea koti lähes kaikelle, mitä sovellus toimittaa: kirjastoille, jotka se tuo, mallitiedostoille, jotka se lataa, konfiguraatiolle, jonka se lukee, mille tahansa resurssille, jonka tuloste tuli rakennustyökalusta, joka tuottaa tiedostopuun (mallimuuntimet, kuvaputket, resurssipakkaajat), ja – mikä tärkeää – itse sovelluskoodille.

Jäädytettyjen moduulien puolen tulisi pysyä pienenä: boot.py REPL:iä edeltävään alustukseen, main.py ohuena aloituspisteenä ja vain ne kirjastot, joita ilman kamera ei aidosti pysty käynnistymään. Kaikki muu menee ROMFS:ään, jossa sen kanssa iterointi on tuore .img, joka tallennetaan ulos IDE:stä ja flashataan uudelleen – ei vaadi laiteohjelmiston uudelleenkäännöstä eikä työkaluketjua käsillä sen tekemiseen.

Tästä seuraava kaava on main.py, joka ei tee mitään muuta kuin delegoi ROMFS:ssä sijaitsevaan sovellukseen:

# main.py (frozen)
import app
app.run()

# /rom/app/__init__.py (in ROMFS)
def run():
    ...

Muutos app-pakettiin on ROMFS-muokkaus ja uudelleenflashaus. Laiteohjelmiston käännös pysyy paikallaan tuotteen elinajan, ellei jokin jäädytetyllä puolella todella joudu muuttumaan.