· kaynak dev.to (home feed)
dev.to rehberi, kuantizasyondan 35 ms çıkarıma kadar bir Android cihaz içi ML hattını haritalıyor
dev.to'da yayımlanan bir yol gösterici yazı, Android uygulamalarında cihaz içi ML çıkarımı için tekrarlanabilir bir hattı ele alıyor — model dönüşümü, int8 kuantizasyonu, interpreter iş parçacığı kullanımı ve ön işleme — ve gerçek dağıtımlardan sayılarla destekliyor.
Hatalardan yeniden inşa edilen bir hatt
dev.to'da yazan bir geliştirici, Android uygulamalarının içinde makine öğrenmesi modellerini çalıştırmaya dair uçtan uca bir rehber yayımladı; rehber, yazarın yaklaşık bir düzine müşteri için dört kez yeniden inşa ettiğini söylediği bir hatta dayanıyor. Yol gösterici yazı tüm zinciri kapsıyor — mimari, dönüşüm, kuantizasyon, paketleme, iş parçacığı kullanımı ve ön işleme — ve gerçek dağıtımlardan sayılarla destekliyor; bunlara 35 ms'lik cihaz içi çıkarım süresi de dahil.
Kuralları şekillendiren hata
Makale bir başarısızlık hikâyesiyle açılıyor. Bir sağlık teknolojisi müşterisi, tıbbi görüntülerin cihazdan çıkması durumunda startup'ın hazır olmadığı bir GDPR ve onay konuşması başlatacağı için, risk skorunu tamamen telefon üzerinde döndüren bir cilt görüntüsü tarama özelliği istiyordu. İlk deneme, özelliği sıradan uygulama kodu gibi ele aldı: ince bir servis arkasında bir TensorFlow SavedModel, ana iş parçacığında çıkarım, kuantizasyon yok. Makaleye göre APK 45 MB büyüdü, başlangıç yavaşladı, çıkarım arayüzü dondurdu ve pil tüketimi ciddi biçimde kötüleşti. Özellik, lansmandan iki hafta sonra kapatıldı.
Önce çıkarımın nerede çalışacağına karar verin
Herhangi bir koddan önce yazar, üç seçenekli bir mimari tercih ortaya koyuyor: TensorFlow Lite ile cihaz içi çıkarım — hızlı, özel ve çağrı başına ücretsizdir ama telefon donanımıyla sınırlıdır ve kurulum anında sabitlenir; bulut çıkarımı — sınırsız model boyutu ve kolay güncelleme sağlar ama gecikme, çağrı başına harcama ve kullanıcı verisinin cihazdan çıkması pahasına; ve yaygın durumlar için küçük bir yerel model ile uç durumlar için daha büyük bir bulut modelini eşleştiren hibrit yaklaşım. Belirtilen varsayılan: Özel verilere dokunan veya bir saniyenin altında yanıt gerektiren her şey cihaz üzerinde çalışır. Yeniden inşa edilen sağlık özelliği risk skorunu 100 ms'nin altında döndürdü; yazar bunun ürünün hissedilişini değiştirdiğini söylüyor.
Kuantizasyon, ekiplerin atladığı adım
Android TFLite çalıştırır, dolayısıyla eğitilmiş TensorFlow veya PyTorch modellerinin önce dönüştürülmesi gerekir — PyTorch için ONNX dışa aktarımı yoluyla. Varsayılan dönüşüm, yazarın cihaz üzerinde büyük ve yavaş olarak tanımladığı bir float32 model üretir. Ağırlıkları float32'den int8'e kuantize etmek modeli yüzde 75 küçültür ve doğru donanıma sahip cihazlarda çıkarımı birkaç kat hızlandırabilir; bunun bedeli küçük bir doğruluk kaybıdır. Ekiplerin yanlış yaptığı adım kalibrasyon: Yalnızca tam sayı kuantizasyonu, tipik girdi örneklerinden oluşan temsilî bir veri kümesi ister; olmadan model ya yanlış dönüşür ya da doğruluk kaybeder — yazarın gördüğünü bildirdiği en yaygın dönüşüm hatası bu. Ayrıca dönüşümü CI'da çalıştırmayı öneriyorlar; böylece model elle taşınan bir dosya değil, bir build çıktısı olur — bir depoda bir model dosyasının üç başıboş kopyasını bulduktan sonra.
Tek interpreter tutun, ana iş parçacığından uzak tutun
Paketleme tavsiyesi somut: Temel TFLite interpreter yaklaşık 1.5 MB'dır, model uygulamanın assets dizinine aittir ve başlangıçta bir ağ yolundan çekilmemelidir. Daha büyük kural yaşam döngüsüyle ilgili. Model yükleme ve çıkarımın ikisi de I/O ve hesaplama yapar; dolayısıyla herhangi birini ana iş parçacığında yapmak application-not-responding hatası riski taşır. Önerilen desen, interpreter'ı bir kez yükleyen, sabit girdi ve çıktı buffer'larını yeniden kullanan ve örneği uygulamanın ömrü boyunca canlı tutan bir sarmalayıcı sınıftır. Her çağrıda yeni bir interpreter oluşturmak, yazarın incelediği Android'de ML kodundaki bir numaralı performans hatası olarak tanımlanıyor; çünkü yalnızca yükleme yüzlerce milisaniye alabilir. Örnek, dört interpreter iş parçacığı ayarlıyor ve tahmini bir arka plan dispatcher'ına taşıyor.
Ön işleme, iyi bir modelin çalışıp çalışmayacağını belirler
Modeller ham görüntüleri değil, kesin bir şekil, aralık ve kanal sırasına sahip tensor'lar kabul eder. İki hata öne çıkıyor: Normalleştirmeyi unutmak — çoğu görüntü modeli -1 ile 1 veya 0 ile 1 aralığında değerler beklerken Android bitmap'leri kanal başına 0-255 verir; bu, Python'da sorunsuz çalışan ama kendinden emin biçimde yanlış çıktı üretir — ve kanal sırasını yanlış ele almak; çünkü TFLite modelleri genellikle RGB ile NHWC düzeni beklerken Android bitmap'leri ARGB'dir. Sonuç, sentetik veriyle testlerden geçen ama gerçek fotoğraflarda başarısız olan bir sınıflandırıcıdır.
Neden önemli
Cihaz içi çıkarım, gizlilik ve gecikme hassasiyeti olan özellikler için varsayılan yanıt hâline geliyor ve düzenlemeler işlemeyi cihaza doğru itmeye devam ediyor. Makalenin netleştirdiği şey, başarısızlıkların çoğunun model kalitesi sorunları değil, entegrasyon sorunları olduğu — iş parçacığı kullanımı, paketleme, kuantizasyon kalibrasyonu ve ön işleme — ve her birinin öngörülebilir olduğudur. Her kurala somut sayılar eşlik ettiği için yazı, hem yeni başlayan ekipler için bir kontrol listesi hem de halihazırda model gönderen kod tabanları için bir inceleme rehberi olarak iş görüyor.
- #android
- #machine-learning
- #tensorflow-lite
- #on-device-inference
- #mobile-development
İlgili yazılar
- Real-SWE benchmark'ı: En iyi coding agent kurumsal görevlerin yüzde 38,8'inde başarı gösteriyor
- Sıfır parametreli belge önbelleği, 100 token'ı aşan belgelerde 1,43M parametreli bir transformer'ı geride bırakıyor
- AgentsDock, uzak araştırma makinelerindeki yapay zeka agent'larını denetlemek için bir IDE piyasaya sürdü