14.2.2.2. Membangun citra ROMFS¶
Sebuah citra ROMFS adalah filesystem read-only yang berada di flash dan di-mount secara otomatis oleh runtime di /rom. Ini memecahkan masalah aset yang ditutup oleh halaman sebelumnya: berkas model machine learning, tabel label, konfigurasi JSON, template citra -- apa pun yang dibuka dan dibaca oleh aplikasi tetapi tidak pernah ditulis -- masuk ke dalam build tanpa membayar biaya disematkan sebagai literal Python.
Tiga hal membuat ROMFS menjadi alat yang tepat untuk aset yang dikirimkan:
Filesystem adalah bagian dari citra firmware. Pengguna akhir tidak dapat menghapus berkas dari
/rom, mengeditnya, atau menggantinya dengan milik mereka sendiri.Berkas di
/romdapat diakses di tempat. Konsumen seperti modulmlyang memuat berkas model mendapatkan tampilan langsung ke flash tanpa salinan RAM -- model berukuran beberapa megabyte di/rom"dimuat" pada dasarnya secara gratis, sedangkan berkas yang sama di/sdcarddibaca ke RAM saat waktu muat dan tetap di sana selama referensi berlangsung.open()+readbiasa menyalin sesuai permintaan: setiap panggilanread(n)menyalinnbyte dari flash ke RAM pada saat panggilan, denganread()polos yang meminta seluruh berkas./romdan/rom/libditambahkan kesys.pathsaat boot. Paket Python yang dimasukkan ke dalam citra dapat diimpor dengan nama; tidak ada yang khusus di sisi pemanggil.
14.2.2.2.1. Membangun citra¶
Citra ROMFS dibuat, diedit, dan di-flash melalui IDE. Gunakan sebagai sumber kebenaran untuk konten setiap partisi ROMFS yang dikirimkan.
Alasan ini penting: berkas model datang dengan persyaratan penyelarasan yang diberlakukan oleh loader saat runtime. Berkas .tflite harus diisi hingga batas 16-byte, dan NPU N6 memerlukan penyelarasan 32-byte untuk model yang dikompilasi. IDE menerapkan padding tersebut secara otomatis saat menulis citra. Alat yang menelusuri pohon sumber tanpa menerapkan padding -- khususnya mpremote romfs -- menghasilkan citra yang di-mount dengan bersih tetapi model-modelnya gagal pada panggilan inferensi pertama.
Editor ROMFS IDE adalah tampilan interaktif dari konten citra. Berkas dan folder dapat ditambahkan, diganti namanya, dan dihapus dalam memori; menyimpan menulis hasilnya sebagai berkas .img yang siap di-flash. Struktur tipikal untuk aplikasi yang mengirimkan model bersama beberapa aset dan paket Python terlihat seperti:
model.tflite
labels.txt
config.json
templates/
calibration.jpg
lib/
mylib/
__init__.py
helpers.py
Tip
Baik IDE maupun mpremote mengkompilasi silang berkas .py ke bytecode .mpy saat masuk ke citra ROMFS, sehingga kamera mengimpornya tanpa membayar biaya parse saat waktu muat. Berkas sumber di editor tetap .py; citra berisi .mpy.
Setelah citra di-flash, pohon terlihat dari MicroPython di /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. Sebagian besar aplikasi berada di ROMFS¶
ROMFS adalah rumah yang tepat untuk hampir semua hal yang dikirimkan oleh aplikasi: library yang diimpornya, berkas model yang dimuatnya, konfigurasi yang dibacanya, aset apa pun yang outputnya berasal dari alat build yang menghasilkan pohon berkas (konverter model, pipeline citra, asset packer), dan -- yang penting -- kode aplikasi itu sendiri.
Sisi modul frozen harus tetap kecil: boot.py untuk pengaturan pra-REPL, main.py sebagai titik masuk yang tipis, dan hanya library yang benar-benar tidak dapat di-boot oleh kamera tanpanya. Semua yang lain masuk ke ROMFS, di mana iterasi di atasnya adalah .img baru yang disimpan dari IDE dan di-flash ulang -- tidak perlu rebuild firmware, tidak perlu toolchain di tangan untuk melakukannya.
Pola yang muncul adalah main.py yang tidak melakukan apa pun selain mendelegasikan ke aplikasi yang berada di ROMFS:
# main.py (frozen)
import app
app.run()
# /rom/app/__init__.py (in ROMFS)
def run():
...
Perubahan pada app adalah edit ROMFS dan reflash. Build firmware tetap di tempatnya selama masa pakai produk kecuali ada sesuatu di sisi frozen yang benar-benar harus berubah.