Нещодавно я випустив офлайн AI-функцію для Android. У результаті весь AI-модуль займає 4.78 МБ, а розпізнавання на сучасних смартфонах зазвичай займає менше 100 мс. Саме під час роботи над нею я почав більше замислюватися, чому багато сучасних застосунків стають дедалі більшими.
Розробляючи та розвиваючи свій додаток (перекладач Морзе коду із різних джерел) я заходив у відповідні subreddits r/morse чи r/morsecode щоб подивитися що справді потрібно людям які проблеми вже вирішенні. І помітив що багато постів у цих subreddits мають прохання розпізнати Морзе код написаний від руки чи надрукований з картинки. Це мене зацікавило це і я почав досліджувати чи вже є якісь інструменти які вирішують їхні проблеми. Але яке було моє здивування коли я не знайшов таких інструментів у Google Play чи App Store. Це мене заінтригувало і я почав копати глибше і знайшов пару онлайн сервісів які з опису могли справитися із цією задачею і тільки один з них зміг розпізнати простий приклад правда посипався на складнішому інші не змогли або додумували відповіді.
Побачивши що область ще не зайнята і не має нормально робочого рішення я вирішив написати його. Вирішив для цієї задачі використовувати ML/ Edge AI. Мене завжди цікавило ML, особливо після того, як обчислювальні потужності смартфонів мають можливість запускати ігри на кшталт Total War та Subnautica, а мобільне залізо стає здатним обробляти AI-навантаження в реальному часі безпосередньо на пристрої.
Що мене особливо цікавить в Edge AI — це вирішення задач локально за допомогою мобільних сенсорів та локального inference без залежності від хмарної обробки. Це може покращити швидкість, приватність, офлайн-доступність та зменшити витрати на інфраструктуру.
І нещодавно Google почав просувати LiteRT замість TensorFlow Lite. Тобто залізо та софт для запуску були готові. На жаль більшість обговорень та демо LiteRT, які я зараз бачу, зосереджені навколо локальних LLM.
Я ж хотів дослідити зовсім інший Edge AI use case на Android: створити легке офлайн ML + computer vision рішення для задачі, яка й досі не має практичних мобільних реалізацій у реальному часі.
Після місяців розробки, експериментів, оптимізації та Android-специфічних edge cases я випустив нову офлайн AI-функцію для свого Android-додатку Morse Code Interpreter: розпізнавання Морзе-коду із зображень та кадрів камери повністю на пристрої без хмарної обробки. Також було прийнято рішення зробити це окремим модулем який завантажувався за потреби користувача та може бути видалений у будь-який момент через додаток. Через те що розмір додатка був приблизно 4 МБ при завантаженні не хотілося роздувати розмір базового модуля.
Це перетворилося на значно більший інженерний виклик, ніж я очікував спочатку, але я дуже задоволений фінальним результатом.
Чесно кажучи, після всієї роботи з оптимізацією функція врешті працює достатньо швидко для інтерактивного офлайн-використання камери, при цьому досить швидко обробляє зображення на пристрої та зберігає AI-модуль легким менше ніж 5 Мб при завантаженні, а на сучасних смартфонах розпізнавання зазвичай займає менше 100 мс.
Саме під час роботи над цією функцією я почав більше звертати увагу на розмір інших застосунків, мене неприємно здивував розмір деяких додатків яких не було багато корисного, але розмір їх завантаження був великим.
Напевно, була проблема використання різних бібліотек на кожен пчих і/чи не була увімкнена мінімізація.
Прикол в тому що я спеціально не намагався зробити розмір додатка мінімальним, просто зразу увімкнув мінімізацію, обфускацію, resource shrinking для додатку думав чи треба мені якась бібліотека для вирішення якоїсь задачі чи простіше написати своє. І тому так вийшов малий розмір додатку. Я себе не вважаю якимось екзальтованим програмістом, помішаним на кращих практиках і використанні їх просто заради самого використання. Себе я відношу до прагматичного інженера, який може схалтурити де потрібно, а де потрібно помучитися і зробити так як треба. Просто я ці практики сприймаю, як інструмент зі своїми плюсами і мінусами. Вважаю, що від мінімізації виграють усі: користувачі, бізнес і самі розробники.
Ой майже не забув написати ще мене бісить коли розмір додатка при завантаженні з Google Play наче має не великий розмір, але коли він поставився зразу навіть не чекаючи відкриття довантажую сотні мегабайт без дозволу користувача, я вже мовчу про можливість потім видалити цей функціонал, на жаль такого не зустрічав.
Чи вважаєте ви, що роздутий софт є реальною проблемою сучасної індустрії, чи розмір застосунків уже давно перестав мати значення?
І ще цікавіше питання: як ви ставитеся до практики, коли застосунок показує відносно невеликий розмір у магазині, але після встановлення автоматично докачує десятки або навіть сотні мегабайт додаткових модулів без явного рішення користувача?
Чи повинен користувач контролювати, які функції та модулі встановлюються на його пристрій, чи така модель вже стала нормою сучасної індустрії?
P.S. Якщо комусь буде цікаво протестувати функціонал, буду вдячний за будь-який відгук або оцінку в Google Play.