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
/romolevat tiedostot ovat käytettävissä paikan päällä. Kuluttajat kuten mallitiedoston lataavaml-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/sdcardluetaan RAM-muistiin latausaikana ja jää sinne viittauksen elinajaksi. Tavallinenopen()+readkopioi tarpeen mukaan: jokainenread(n)-kutsu kopiointavua flash-muistista RAM-muistiin kutsun hetkellä, ja paljasread()pyytää koko tiedostoa./romja/rom/liblisätään polkuunsys.pathkä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.