14.2.2.2. Bir ROMFS imajı oluşturma¶
Bir ROMFS imajı, çalışma zamanının /rom konumunda otomatik olarak bağladığı, flash bellekte yerleşik, salt okunur bir dosya sistemidir. Önceki sayfanın değindiği varlık sorununu çözer: makine öğrenimi model dosyaları, etiket tabloları, JSON yapılandırması, görüntü şablonları – uygulamanın açtığı ve okuduğu ancak hiçbir zaman yazmadığı her şey – Python sabitleri olarak gömülmenin maliyetini ödemeden yapıya katılır.
Üç şey, ROMFS’yi sevk edilen varlıklar için doğru araç yapar:
Dosya sistemi aygıt yazılımı imajının bir parçasıdır. Son kullanıcılar
/romiçinden bir dosyayı silemez, düzenleyemez veya kendi dosyalarıyla değiştiremez./romiçindeki dosyalara yerinde erişilir. Bir model dosyasını yükleyenmlmodülü gibi tüketiciler, hiçbir RAM kopyası olmadan flash belleğe doğrudan bir görünüm elde eder –/romüzerindeki çok megabaytlık bir model esasen bedavaya “yüklenir”, oysa/sdcardüzerindeki aynı dosya yükleme zamanında RAM’e okunur ve referansın ömrü boyunca orada kalır. Sıradanopen()+read, talep üzerine kopyalar: herread(n)çağrısı, çağrı anında flash bellekten RAM’enbayt kopyalar, çıplak birread()ise tüm dosyayı ister./romve/rom/lib, önyüklemedesys.path‘e eklenir. İmaja bırakılan Python paketleri adına göre içe aktarılabilir; çağrı yerinde özel hiçbir şey yoktur.
14.2.2.2.1. Bir imaj oluşturma¶
ROMFS imajları, IDE üzerinden oluşturulur, düzenlenir ve flash’a yazılır. Sevk edilen her ROMFS bölümünün içeriği için onu doğruluk kaynağı olarak kullanın.
Bunun önemli olmasının nedeni: model dosyaları, çalışma zamanındaki yükleyicinin uyguladığı hizalama gereksinimleriyle gelir. .tflite dosyaları 16 baytlık sınırlara doldurulmalıdır ve N6’nın NPU’su, derlenmiş modeller için 32 baytlık hizalama gerektirir. IDE, imajı yazarken bu doldurmayı otomatik olarak uygular. Doldurmayı uygulamadan kaynak ağacında dolaşan araçlar – özellikle mpremote romfs – temiz bir şekilde bağlanan ancak modelleri ilk çıkarım çağrısında başarısız olan bir imaj üretir.
IDE’nin ROMFS düzenleyicisi, imaj içeriğinin etkileşimli bir görünümüdür. Dosyalar ve klasörler bellekte eklenebilir, yeniden adlandırılabilir ve silinebilir; kaydetme, sonucu flash’a yazılmaya hazır bir .img dosyası olarak yazar. Bazı varlıklar ve bir Python paketinin yanında bir model sevk eden bir uygulama için tipik bir yapı şöyle görünür:
model.tflite
labels.txt
config.json
templates/
calibration.jpg
lib/
mylib/
__init__.py
helpers.py
Tüyo
Hem IDE hem de mpremote, .py dosyalarını bir ROMFS imajına girerken .mpy bayt koduna çapraz derler, böylece kamera onları yükleme zamanında ayrıştırma maliyetini ödemeden içe aktarır. Düzenleyicideki kaynak dosyalar .py kalır; imaj .mpy içerir.
İmaj flash’a yazıldıktan sonra, ağaç MicroPython’dan /rom/ konumunda görünür:
>>> 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. Uygulamanın çoğu ROMFS’de bulunur¶
ROMFS, bir uygulamanın sevk ettiği hemen hemen her şey için doğru yuvadır: içe aktardığı kütüphaneler, yüklediği model dosyaları, okuduğu yapılandırma, çıktısı bir dosya ağacı üreten bir yapı aracından gelen herhangi bir varlık (model dönüştürücüler, görüntü boru hatları, varlık paketleyiciler) ve – önemli olarak – uygulama kodunun kendisi.
Dondurulmuş modüller tarafı küçük kalmalıdır: REPL öncesi kurulum için boot.py, ince bir giriş noktası olarak main.py ve yalnızca kameranın gerçekten onlarsız önyükleyemeyeceği kütüphaneler. Geri kalan her şey ROMFS’ye gider, burada üzerinde yineleme yapmak IDE’den kaydedilip yeniden flash’a yazılan taze bir .img dosyasıdır – aygıt yazılımının yeniden oluşturulması gerekmez, bunu yapmak için elde araç zinciri gerekmez.
Ortaya çıkan desen, ROMFS’de yerleşik uygulamaya devretmekten başka bir şey yapmayan bir main.py‘dir:
# main.py (frozen)
import app
app.run()
# /rom/app/__init__.py (in ROMFS)
def run():
...
app‘te bir değişiklik, bir ROMFS düzenlemesi ve bir yeniden flash’a yazma demektir. Dondurulmuş tarafta gerçekten bir şeyin değişmesi gerekmedikçe, aygıt yazılımı yapısı ürünün ömrü boyunca olduğu gibi kalır.