Чому 90% Edge AI стартапів не доживають до продакшну

💡 Усі статті, обговорення, новини про AI — в одному місці. Приєднуйтесь до AI спільноти!

Edge AI — один із найгучніших трендів останнього десятиліття. Венчурні кола люблять статистику про ринок у >$20 Billion, аналітики малюють діаграми, а стартапи наперебій демонструють швидкодію моделей на ноутбуках. Але реальний світ жорстокий: більшість проєктів зі ШІ на периферії (edge) так і не переходить у продакшен.

Я з проєктом I-SEE пройшов шлях від прототипу до впровадження. Спілкуючись із багатьма розробниками та регулярно зустрічаючись на полігонах (адже спільнота в Україні зараз надзвичайно активна), я на власні очі бачив, як десятки проєктів руйнуються на етапах, про інженери воліють мовчати. Тут — чесний розбір причин, чому 9 з 10 edge-AI стартапів зазнають краху.

Хайп моделі ≠ реальність продакшену: міф про «головний алгоритм»

Edge AI стартап

У теорії та на пітч-деках здається, що достатньо натренувати модель до 99% точності — і продукт готовий. На практиці, згідно з класичною статтею Google про технічний борг у ML, сам код моделі — це крихітний квадрат (близько 5–10%) у центрі величезної інфраструктурної схеми.

В Edge AI ця диспропорція ще більш жорстока. Модель — це просто математичне ядро. Щоб вона працювала в реальному пристрої, потрібно розв’язати фундаментальні інженерні проблеми, про які дата-саєнтисти (DS) часто навіть не підозрюють.

Технічна реальність проти лабораторної утопії:

Проблема «Скло-до-Скла» (Glass-to-Glass Latency):

Міф: «Наша модель робить інференс за 15 мс».

Реальність: Час від фотона, що потрапив на матрицю камери, до сигналу на актуаторі може становити 100+ мс.

Де втрачається час: Експозиція сенсора (10–30 мс) → Зчитування даних (Readout) → ISP (обробка сигналу: дебаєризація, баланс білого) → Копіювання пам’яті (DMA) → Препроцесинг (ресайз, нормалізація, конвертація кольорів) → Інференс моделі (ті самі 15 мс) → Постпроцесинг (NMS, трекінг) → Логіка застосунку.

Висновок: оптимізація моделі з 15 мс до 10 мс не врятує, якщо ваш пайплайн захоплення кадру займає 60 мс.

Domain Shift і «брудні» дані:

DS тренують мережі на ImageNet або COCO: ідеально освітлених, відібраних фотографіях.

У полях камера бачить: пересвіти (сонце в об’єктив), моушн-блюр (розмиття від руху), шуми матриці за низького освітлення (ISO noise), бруд на об’єктиві, артефакти компресії відеопотоку.

Приклад: Детектор працює ідеально вдень, але ввечері, у світлі ртутних ламп, спектр змінюється, і модель перестає бачити об’єкти. Це називається Data Drift, і на Edge його неможливо виправити «на льоту».

Препроцесинг як «вузьке місце» (bottleneck):

Часто код передобробки (нарізка, поворот, вирівнювання гістограми), написаний на Python/NumPy, працює повільніше, ніж сам нейромережевий інференс на прискорювачі (NPU).

Перенесення цієї логіки на C++ або використання апаратних блоків відеочипа (Video Processing Unit) — це окремий, трудомісткий пласт роботи, який не має стосунку до навчання нейромереж.

Життєвий цикл (MLOps on Edge):

Як ви оновите модель на 10 000 пристроїв, підключених через нестабільний 3G?

Що робити, якщо нова модель викликає Kernel Panic на старій версії драйверів?

Як відкотити прошивку (A/B partitioning), якщо пристрій «оцеглинився» (перетворився на цеглину)?

Модель — це не продукт. Продукт — це відмовостійкий конвеєр із доставки даних у модель і прийняття рішень на їх основі, що працює в агресивному середовищі.

Обмеження compute, пам’яті та живлення: дієта, яка вбиває моделі

Багато стартапів падають у «прірву прототипування». Вони плутають можливість запустити модель один раз на потужному девкіті з можливістю запускати її 24/7 на кінцевому пристрої.

Прірва між залізом розробника та залізом замовника:

Характеристика

Середовище розробки (Lab)

Середовище продакшену (Field)

Hardware

NVIDIA RTX 3090 / Jetson Orin AGX

STM32, ESP32, Rockchip RV1109, Ambarella

Пам’ять (RAM)

24 ГБ — 64 ГБ

512 КБ — 4 ГБ (Shared with OS)

Енергія

Розетка (200W+)

Акумулятор (2—5W) або Coin cell (mW)

Точність

FP32 (Float)

INT8 / INT4 (Quantized)

Три головні вбивці продуктивності

    Коли ми говоримо про продуктивність на Edge, варто забути про синтетичні бенчмарки. Існують три головні «вбивці», які безжально руйнують будь-які лабораторні досягнення.

    Перший і найпідступніший ворог — це тепловий тротлінг (Thermal Throttling). В ідеальних умовах лабораторії ваша плата (наприклад, Jetson Nano або Raspberry Pi) лежить відкритою на столі, обдуваючись кондиціонованим повітрям. Але в реальному продакшені все інакше. Зазвичай пристрій запаковують у глухий, герметичний пластиковий або алюмінієвий корпус стандарту IP67, щоб захистити від дощу та пилу. Вентиляторів там немає — вони ламаються першими або швидко забиваються брудом. Уявіть типовий сценарій: ваша розумна камера висить на стовпі під прямим липневим сонцем.

    Температура всередині чорного корпусу стрімко досягає 70—80°C. Щойно кристал SoC (System on a Chip) перегрівається, спрацьовує базовий інстинкт виживання кремнію — процесор автоматично скидає тактову частоту вдвічі або втричі, щоб фізично не згоріти. Ваш ідеально вилизаний пайплайн, який видавав стабільні 30 FPS, миттєво просідає до 10-15 FPS. Відбувається розсинхронізація потоків, буфери переповнюються, і система фактично перестає виконувати своє завдання в реальному часі.

    Другий, не менш критичний фактор — це пам’ять як найдорожчий ресурс. Більшість початківців в Edge AI помилково вважають, що головна проблема — це брак обчислювальної потужності (FLOPS). Насправді ж сучасні архітектури впираються у так звану «стіну пам’яті» (Memory Wall). Проблема не в тому, щоб перемножити дві матриці, а в тому, щоб швидко доставити ці дані до арифметико-логічного пристрою. Фізика невблаганна: енергія, необхідна для зчитування 32-бітного числа із зовнішньої DRAM-пам’яті, приблизно у 100-200 разів вища, ніж енергія на саму математичну операцію додавання чи множення (MAC) у регістрі. Моделі, які не поміщаються у швидкий L1/L2 кеш процесора або SRAM мікроконтролера, змушують систему постійно звертатися до повільної та енергозатратної зовнішньої пам’яті, що в прямому сенсі випалює батарею.

    Класичний приклад — архітектура MobileNetV2. Сама по собі модель «важить» дуже мало, її ваги займають лише близько 3 МБ на диску. Але для обробки кадру високої роздільної здатності вона генерує величезні карти проміжних активацій (activation maps). На дешевому IoT-пристрої або мікроконтролері з 2-4 МБ оперативної пам’яті вона просто не запуститься, викинувши критичну помилку OOM (Out Of Memory), навіть якщо на папері процесор здатний видати потрібні флопси.

    І нарешті, третій фактор, який руйнує ілюзії стартапів — це сліпа віра в маркетингові TOPS (Tera Operations Per Second). Виробники чипів обожнюють писати на коробках гарні цифри на кшталт «5 TOPS», але вони скромно замовчують, що такі показники досягаються лише на піковому споживанні струму. Якщо розігнати чип до максимуму, він може і видасть ці 5 TOPS, але при цьому виснажить батарею вашого дрона за лічені 7 хвилин. В суворій інженерній реальності єдина метрика, яка має значення для портативних пристроїв — це TOPS/Watt (продуктивність на ват витраченої енергії).

    Інженерам постійно доводиться шукати болючий компроміс між математичною точністю та енергоефективністю. Саме тому індустрія масово переходить на квантизацію (Quantization). Знижуючи розрядність ваг моделі з традиційного числа з рухомою комою (FP32) до 8-бітних цілих чисел (INT8) або навіть INT4, ви неминуче жертвуєте 2-5% початкової точності розпізнавання. Проте цей компроміс дозволяє зменшити пропускну здатність шини пам’яті в 4 рази і виграти до 400% додаткового часу автономної роботи, перетворюючи лабораторну іграшку на життєздатний комерційний продукт.

    Якщо ваша модель вимагає 10 Ват, а пристрій розсіює тільки 2 Вати тепла — фізику не обдурити. Вам доведеться переписувати все з нуля під інше залізо.

    Інтеграція з hardware: The «Python Gap» та пекло драйверів

    Існує небезпечна ілюзія: «Якщо це працює в Jupyter Notebook, значить, це працює». Насправді код прототипу на Python і код для вбудованої (embedded) системи — це два різні всесвіти.

    Три кола пекла інтеграції:

    • Пастка Unsupported Layers (NPU Compiler Trap):
      • ML-дослідники люблять використовувати новітні функції активації (наприклад, Swish або Mish) або кастомні шари.
      • Апаратні прискорювачі (NPU/TPU) працюють через жорсткі компілятори (TensorRT, OpenVINO, RKNN). Якщо компілятор не знає ваш шар, він відкидає виконання цього шматка назад на слабкий CPU.
      • Результат: замість обіцяних 30 FPS ви отримуєте 2 FPS, тому що CPU задихається, обробляючи один «непідтримуваний» шар, поки потужний NPU простоює.
    • Zero-Copy Pipeline або смерть:
      • У Python легко написати image = cv2.imread(), потім result = model.predict(image).
      • В embedded-світі копіювання пам’яті — це злочин. Кадр з камери важить 3-5 МБ. Скопіювати його 4 рази (драйвер → RAM → препроцесинг → NPU) займає більше часу, ніж сам інференс.
      • Рішення: доводиться використовувати DMA (Direct Memory Access), розділювану пам’ять і складні фреймворки типу GStreamer або DeepStream, щоб вказівник на область пам’яті передавався ланцюжком без жодного копіювання. Це вимагає кваліфікації рівня Senior C++ Embedded, а не Junior Data Scientist.
    • Взаємодія з периферією — це не файли читати:
      • Камера в продакшені — це не вебкамера USB. Це сенсор на шині MIPI-CSI, що вимагає налаштування драйверів V4L2, калібрування ISP (Image Signal Processor) і синхронізації потоків.
      • Сценарій: що відбувається, якщо камера «відвалюється» через електромагнітне наведення? Python-скрипт просто вилітає з винятком (exception).
      • Продакшен: потрібен Hardware Watchdog, який апаратно перезавантажить живлення сенсора або всього пристрою, якщо heartbeat-сигнал зник на 500 мс. Код повинен вміти «падати» безпечно, не залишаючи пристрій у завислому стані.

    Переписування пайплайну з Python на C++ з урахуванням апаратних особливостей (Zero-copy, NPU constraints) займає 4-6 місяців роботи команди, а не «пару тижнів», як планують менеджери.

    Брак даних = погані моделі в реальному світі: пастка «Довгого хвоста»

    Академічні датасети (COCO, ImageNet) — це «Діснейленд». Там ідеальне світло, об’єкти в центрі кадру і збалансовані класи (50% кішок, 50% собак). Реальність Edge AI — це «Божевільний Макс».

    Чотири вершники апокаліпсиса даних

    Edge AI стартап

    У практиці комп’ютерного зору та edge-AI існують чотири системні проблеми, які майже завжди недооцінюють на старті, але саме вони визначають, чи стане рішення життєздатним у продакшені.

    № 1 — Проблема «Довгого хвоста» (Long Tail Distribution):

    Перша — це проблема «довгого хвоста» (Long Tail Distribution). У реальному світі події, які нас цікавлять, майже завжди рідкісні. У задачі детекції дефектів на конвеєрі типовий рівень браку може становити 0.02% або навіть менше. Це означає, що на 1 мільйон одиниць продукції припадає лише 200 дефектів. Якщо для стабільного навчання моделі потрібно хоча б 1000–3000 різноманітних прикладів дефектів, вам доведеться прогнати через систему десятки мільйонів зображень. Формально модель може показувати 99.98% accuracy, просто передбачаючи «норму» у кожному випадку. Але така точність — статистична ілюзія. Якщо подивитися на recall для позитивного класу, він буде близький до нуля. У задачах з дисбалансом класів більш релевантними стають метрики на кшталт F1-score, ROC-AUC або PR-AUC, а не загальна точність.

    Oversampling чи синтетичні аугментації частково допомагають, але вони не створюють нової фізики дефектів. Якщо в реальності існує 50 типів мікротріщин, а у вас є приклади лише 5, жодна генеративна трансформація не замінить реальних даних. Це схоже на навчання лікаря лише на фотографіях одного типу пухлини — формально він «навчений», але клінічна різноманітність його зламає.

    № 2 — Бендвідч і «Data Gravity»: не можна вивантажити все в хмару:

    Друга проблема — пропускна здатність каналу і так звана «гравітація даних» (Data Gravity). Уявімо, що у вас 1000 камер на віддалених об’єктах, кожна генерує відео 1080p зі швидкістю 4 Мбіт/с. Безперервний стрімінг 24/7 — це приблизно 43 ГБ на добу з однієї камери, тобто понад 43 ТБ щодня з усієї мережі. За LTE-тарифами це астрономічні витрати. Тому ідея «давайте просто все відправляти в хмару й там розбиратися» економічно нежиттєздатна.

    Але виникає парадокс: щоб покращити модель, потрібно зібрати саме ті приклади, де вона помиляється. А щоб знати, де вона помиляється, треба вже мати механізм оцінки невпевненості. Саме тут з’являється потреба в active learning безпосередньо на edge-пристрої. Пристрій повинен обчислювати confidence score, ентропію розподілу класів або використовувати техніки на кшталт Monte Carlo Dropout для оцінки невизначеності. Кадри з низькою впевненістю, наприклад у діапазоні 0.4–0.6, або з високою ентропією, відправляються в хмару для ручної розмітки. Таким чином зменшується трафік на порядки — замість 100% даних передається 0.1–1%. Але це означає, що на edge-пристрої має працювати не лише інференс, а й додаткова логіка відбору, буферизації, дедуплікації та шифрування даних. Edge стає міні-MLOps-системою.

    № 3 — Sensor Fragmentation (пекло заліза):

    Третя проблема — фрагментація сенсорів або «пекло заліза». Ви могли зібрати датасет на одну камеру з великим динамічним діапазоном і стабільним кольоровим профілем, наприклад екшн-камеру з хорошою оптикою. Але у продакшені через економію ставлять дешевший сенсор із меншою світлочутливістю, іншим шумовим профілем, автоекспозицією іншого алгоритму і вузьким dynamic range. Для моделі це інший світ. Змінюється гістограма яскравості, баланс білого, співвідношення сигнал/шум. Навіть невелика різниця в інфрачервоному фільтрі може вплинути на сприйняття текстур.

    У термінах машинного навчання це класичний domain shift. Розподіл піксельних значень у тренувальному та продакшен-середовищі більше не збігається. Результат — деградація точності інколи на 20–40% без жодної зміни архітектури. Вирішувати це можна через domain adaptation, color normalization, histogram matching, fine-tuning на нових даних або навіть через використання synthetic-to-real підходів. Але в будь-якому разі дані жорстко прив’язані до фізики сенсора. Модель не є абстрактною — вона оперує конкретними фотонами, що пройшли через конкретну лінзу.

    № 4 — вартість розмітки та «Data Rot»:

    Четверта проблема — вартість розмітки та явище «data rot». Розмітка у складних промислових задачах може коштувати від 0.05 до 5 доларів за зображення залежно від складності. Якщо вам потрібно 50 000 нових прикладів на місяць для підтримки якості, це вже десятки тисяч доларів постійних витрат. Але навіть якщо бюджет є, проблема не зникає: світ змінюється. Змінюється одяг працівників, сезонність, освітлення, навіть пил у повітрі. Камери можуть злегка зміститися або забруднитися. Через пів року розподіл даних у продакшені вже не відповідає тому, на якому модель навчалася.

    Це нагадує деградацію програмного забезпечення без оновлень безпеки. Якщо немає безперервного конвеєра збору нових «складних» прикладів, їхньої швидкої розмітки, автоматичного ретрейнінгу, валідації та деплою, система поступово втрачає релевантність. У зрілих командах це перетворюється на Data CI/CD: автоматичні тригери збору edge cases, версіонування датасетів, контроль data drift через статистики на кшталт KL-divergence або Population Stability Index, автоматичне A/B-тестування нових моделей і rolling update на пристроях.

    У підсумку перемагає не той, у кого найглибша нейромережа чи наймодніша архітектура. Перемагає той, хто побудував замкнений цикл: пристрій виявляє невпевнені або аномальні кейси, система швидко їх розмічає, модель перенавчається, нова версія проходить автоматичну перевірку і деплоїться за 24 години. У реальних промислових умовах саме швидкість обробки edge cases і керування даними стає стратегічною перевагою, тоді як сама модель перетворюється лише на одну з компонент складної інженерної екосистеми.

    Latency та реальний час: коли мілісекунди коштують життів

    Edge AI стартап

    Головна омана новачків: плутати Throughput (пропускну здатність, FPS) і Latency (затримку реакції). У Cloud AI вам важливий Throughput: ви можете зібрати 64 запити в батч (batching) і обробити їх ефективно. Затримка у 200 мс нікого не вб’є.

    В Edge AI, особливо в робототехніці або ADAS (системи допомоги водієві), батчинг заборонений. Вам потрібно обробити поточний кадр до того, як прийде наступний.

    Чому ваша модель на 30 FPS не працює в реальному часі:

    • Jitter (Джитер) — прихований ворог:
      • Проблема: середня затримка може бути 30 мс, але кожен 100-й кадр обробляється 150 мс через те, що Linux-планувальник (scheduler) вирішив запустити фоновий процес або спрацював Garbage Collector у Python.
      • Наслідок: у системах управління (PID-контролери) це призводить до втрати стабільності. Робот починає «смикатися», дрон розгойдується.
      • Рішення: Використання RTOS (Real-Time OS) або патчів PREEMPT_RT для Linux, ізоляція ядер CPU (CPU shielding) винятково під процес інференсу.
    • Затримка дисплея (Display Lag):
      • Якщо ваш пристрій щось показує людині (наприклад, AR-окуляри або цифровий приціл), затримка motion-to-photon має бути < 20 мс.
      • Якщо затримка > 40 мс, у користувача починається морська хвороба (cyber sickness) через розсинхронізацію вестибулярного апарату та зору. Більшість стандартних Android/Linux графічних стеків дають 60-80 мс затримки просто «з коробки» (потрійна буферизація).
    • Асинхронність проти Синхронності:
      • Data Scientist пише код послідовно: Get Frame -> Process -> Inference -> Act.
      • У реальній системі це призводить до простою ресурсів. Поки камера знімає, NPU спить. Поки NPU рахує, CPU спить.
      • Продакшен: повністю асинхронний багатопотоковий пайплайн. Але це породжує Race Conditions (стан гонитви) і Deadlocks, які неймовірно складно дебажити на пристрої.

    Приклад катастрофи: ціна затримки в реальних умовах

    Уявіть типовий промисловий сценарій: безпілотний навантажувач рухається територією складу зі швидкістю всього 2 метри на секунду. Здавалося б, це дуже повільно і контрольовано. Інженери пишаються тим, що їхня нейромережа видає блискавичний інференс — на розпізнавання перешкоди в кадрі йде лише 30 мілісекунд. Проте в реальному світі до цього часу невідворотно додаються інші процеси. Від моменту спрацьовування матриці камери на передачу даних та їх препроцесинг витрачається ще близько 70 мілісекунд. Після того, як модель прийняла рішення, системі потрібно додатково 100 мілісекунд на відпрацювання логіки управління, передачу сигналу через CAN-шину та фізичну активацію гальмівної системи.

    У сумі ми отримуємо 200 мілісекунд повної апаратної затримки від появи події до реакції на неї. За цей час абсолютно «сліпий» навантажувач за інерцією встигає проїхати 40 сантиметрів. Якщо людина або інша техніка з’явиться раптово в цій зоні, аварія стає неминучою з точки зору фізики, і жодна, навіть найгеніальніша чи найточніша модель штучного інтелекту, не зможе запобігти зіткненню.

    Боротьба за Latency — це боротьба за видалення шарів абстракції. Часто доводиться викидати Python, OpenCV і Docker, опускаючись на рівень C++ і прямих викликів драйверів, щоб виграти заповітні мілісекунди.

    Інструменти та дебаг: археологія замість розробки

    Інструменти та дебаг на Edge — це радше археологія, ніж інженерія. Якщо сучасний backend-розробник живе у світі спостережуваності, де є централізовані логи, метрики й трасування запитів через Sentry, Datadog, Prometheus та оркестрацію через Kubernetes, то edge-інженер працює в умовах майже повної темряви. На сервері падіння сервісу — це stack trace у дашборді й кілька кліків до root cause. На пристрої, який висить на стовпі в іншому місті, падіння — це тиша.

    Чому дебаг (відлагодження) на Edge з’їдає 40% часу команди

    Перша причина: «чорна скринька» на стовпі

    Типовий edge-девайс підключений через LTE-модем, знаходиться за NAT без «білої» IP-адреси, має нестабільний канал із латентністю 80–200 мс і періодичними втратами пакетів. Ви не можете просто під’єднатися по SSH у будь-який момент — тунель може обірватися посеред сесії. Ви не можете відкрити вікно зображення через cv2.imshow(), бо канал не витримає навіть стислий відеопотік 1080p із бітрейтом 2–4 Мбіт/с. Навіть якщо організувати тимчасовий стрім, це різко збільшить споживання трафіку та навантаження на CPU.

    Коли пристрій зависає через kernel panic або watchdog reset, ситуація стає ще гіршою. Багато edge-систем працюють на SD-картах із файловими системами на кшталт ext4 із write-back кешуванням. Якщо живлення зникає раптово або ядро падає, останні логи можуть просто не встигнути фізично записатися на носій. Ви отримуєте «мовчазну цеглину» без жодного дампу. У серверному світі це виглядало б абсурдом, але в полі це щоденна реальність.

    Друга причина: гейзенбаги (Heisenbugs)

    Окрема категорія болю — так звані гейзенбаги. Назва походить від принципу невизначеності: сам факт спостереження змінює систему. Уявімо класичну race condition між потоком захоплення кадрів із камери та потоком інференсу нейромережі. При нормальному темпі роботи NPU-кадри обробляються з затримкою 30–40 мс, і час від часу виникає неконсистентний стан буфера. Ви підключаєтеся відладчиком, наприклад через GNU Debugger, система сповільнюється вдвічі, таймінги змінюються — і баг зникає. Ви відключаєтеся, повертаєте звичайну швидкість — і пристрій знову падає раз на кілька годин. У результаті команда може витратити тижні на відлов проблеми, яка проявляється лише під конкретним навантаженням, температурою чи навіть при певному рівні сигналу LTE.

    Третя причина: відсутність профайлерів

    Проблема ускладнюється відсутністю зрілих профайлерів на багатьох edge-платформах. Якщо ви працюєте з GPU від NVIDIA, у вас є Nsight та інші інструменти для аналізу латентності, використання пам’яті й завантаження ядер. Але на дешевих SoC від Rockchip чи навіть на Raspberry Pi профайлінг NPU або ISP часто обмежений мінімальними лічильниками. Ви бачите лише симптом: FPS впав із 15 до 7. Але що є причиною — throttling через перегрів (CPU знизив частоту з 1.5 ГГц до 800 МГц), нестача пам’яті та свопінг, перевантаження шини CSI від камери чи витік у драйвері — невідомо. У відсутності детальної телеметрії інженери повертаються до примітивної техніки вставляння логів і таймштампів у десятки місць коду, вимірюючи різницю через std::chrono або clock_gettime. Це повільно й неточно, але часто єдиний варіант.

    Четверта причина: необхідність Replay System

    Саме тому зрілі edge-команди рано чи пізно приходять до необхідності Replay System. Якщо неможливо якісно дебажити в полі, потрібно переносити поле в лабораторію. Пристрій має вміти зберігати сирі дані сенсорів — наприклад, raw-дамп із камери у форматі Bayer або YUV — за кілька секунд до збою. Для цього потрібен циклічний буфер у пам’яті або на eMMC, який постійно перезаписується, і тригер, що спрацьовує при crash-сигналі чи аномалії. У лабораторії ці дані «програються» через той самий пайплайн обробки, емулюючи роботу ISP, декодера та нейромережі. Лише за умови детермінованого відтворення можна крок за кроком відтрасувати, у який момент виникає некоректний стан.

    Побудова такої інфраструктури — це окремий інженерний проєкт: потрібно синхронізувати часові мітки між потоками, фіксувати версію прошивки, контрольні суми моделі, параметри експозиції камери, температуру чипа. Без цього відтворення буде неточним, а баг — невловимим. Якщо ж replay-системи немає, команда ризикує «латати» симптоми місяцями, не розуміючи справжньої причини.

    У результаті edge-стартапи змушені ставати будівельниками інструментів. Вони пишуть власні системи логування з буферизацією та компресією, реалізують OTA-оновлення з атомарним перемиканням розділів (A/B partitioning), будують тунелі для віддаленого доступу через reverse SSH або MQTT, створюють watchdog-механізми й health-check протоколи. Часто до 30–40% інженерного часу йде не на покращення алгоритмів чи моделі, а на створення мінімальної спостережуваності й керованості.

    На відміну від хмарного світу, де інфраструктура вже стандартизована, на Edge кожна команда частково винаходить свій стек заново. І саме якість цих «невидимих» інструментів часто визначає, чи зможе продукт масштабуватися, чи назавжди залишиться набором нестабільних пристроїв у полі.

    Безпека, відмовостійкість, експлуатація: виживання в дикій природі

    У лабораторії є UPS (безперебійник) і добрий системний адміністратор. У полях є п’яний електрик, вандали і стрибки напруги. Ваше ПЗ має бути не просто «надійним», воно має бути «безсмертним».

    Чотири рівні захисту, які всі ігнорують

    № 1: корупція даних при втраті живлення (Power Cut Safety)

    Перший рівень — стійкість до втрати живлення. У польових умовах відключення електрики — не виняток, а норма: просадки мережі, нестабільні блоки живлення, випадкове висмикування кабелю. Типовий сценарій виглядає невинно: пристрій записує логи або оновлює конфігураційний файл, і в цей момент живлення зникає. Якщо коренева файлова система базується на ext4 у режимі write-back, частина метаданих може залишитися в кеші сторінок. Після перезавантаження система потрапляє в initramfs і вимагає ручного запуску fsck. У серверній кімнаті це дрібниця, але на пристрої без клавіатури й монітора це фактично «мертвий» вузол.

    Професійний підхід передбачає read-only RootFS. Коренева система монтується лише для читання, а тимчасові зміни спрямовуються в overlayfs поверх неї. Таким чином, навіть при раптовому вимкненні живлення базовий образ залишається консистентним. Усі критичні записи — наприклад, оновлення конфігурації або індексу моделі — виконуються атомарно: спочатку запис у тимчасовий файл, потім fsync(), після чого rename(), який у POSIX гарантує атомарність операції. Для пристроїв із eMMC або industrial-grade SD додатково враховують write amplification і ресурс циклів перезапису, щоб уникнути деградації накопичувача через надмірне логування.

    № 2: оновлення «повітрям» (OTA) і ризик «оцеглинення»

    Другий рівень — безпечні OTA-оновлення. Уявімо, що ви розгорнули нову версію моделі, яка споживає на 10% більше оперативної пам’яті. На частині пристроїв із меншим запасом RAM це викликає kernel panic під час ініціалізації драйвера NPU. Якщо оновлення встановлюється «поверх» робочої системи, ви отримуєте сотні «оцеглених» девайсів, які потрібно фізично перепрошивати через UART або USB. Для мережі з 10 000 пристроїв навіть 3–5% фейлу — це сотні виїздів інженерів і десятки тисяч доларів операційних витрат.

    Тому в індустрії застосовують A/B partitioning. Пристрій має два системні розділи — активний і резервний. Нова прошивка записується в неактивний розділ. Після перезавантаження завантажувач перемикається на нього, але остаточне підтвердження відбувається лише після проходження health-check: старт сервісів, підняття мережі, успішний self-test моделі, відсутність перезавантажень протягом, скажімо, 5 хвилин. Якщо система не підтверджує успішний старт, апаратний watchdog або логіка bootloader автоматично повертає попередню версію. Такий механізм давно використовується в автомобільній електроніці та телеком-обладнанні, але багато стартапів нехтують ним через складність реалізації.

    № 3: фізична безпека і крадіжка IP

    Третій рівень — фізична безпека та захист інтелектуальної власності. Якщо пристрій встановлений на вулиці або в напівпублічному просторі, його можуть вкрасти або просто розібрати. SD-карта виймається за секунди, після чого зловмисник отримує доступ до файлової системи, API-ключів, сертифікатів і самої нейромережі, на розробку якої могли піти сотні тисяч доларів. У світі серверів ми покладаємося на контроль доступу до дата-центру. На Edge фізичний доступ потрібно вважати гарантованим.

    Захист починається зі шифрування диска через LUKS/dm-crypt. Але простого пароля недостатньо — ключ має бути прив’язаний до апаратного кореня довіри: Secure Boot, TPM або ARM TrustZone. Це означає, що розшифрування можливе лише на конкретному чипі, а спроба зчитати накопичувач на іншому пристрої не дасть результату. Додатково модель може зберігатися в зашифрованому вигляді й розшифровуватися тільки в оперативній пам’яті під час запуску, без збереження на диск у відкритому форматі. У деяких рішеннях ключ генерується з унікального ідентифікатора SoC і ніколи не покидає secure enclave.

    № 4: сторожові таймери (Watchdogs)

    Четвертий рівень — сторожові таймери. Будь-яке складне програмне забезпечення рано чи пізно зависає. Це не питання «чи», а питання «коли». Якщо система працює місяцями без перезапуску, накопичуються витоки пам’яті, драйвери можуть входити в неконсистентний стан, мережеві стеки — зациклюватися. Програмний watchdog у вигляді демона, який перевіряє процеси, не гарантує нічого: якщо ядро зависло або scheduler зупинився, цей демон не виконається.

    Єдиний надійний варіант — апаратний watchdog, інтегрований у SoC або реалізований окремим чипом. Він вимагає регулярного «підживлення» сигналом з боку системи. Якщо протягом, наприклад, 10–30 секунд сигнал не надходить, watchdog фізично перезавантажує пристрій або навіть скидає живлення. У критичних інфраструктурах — від банкоматів до телеком-базових станцій — це стандартна практика. Без такого механізму один завислий процес може залишити пристрій недоступним до наступного фізичного втручання.

    Експлуатація — це коли ви спите спокійно, знаючи, що якщо на всьому заводі відрубається світло, ваші 50 камер перезавантажаться, відновлять зв’язок і продовжать роботу без єдиного втручання людини.

    Команда та спеціалізація: вам потрібні мутанти

    Edge AI стартап

    Типова помилка фаундера: найняти 5 Data Scientists, одного фронтендера для красивого UI і одного «залізячника-фрілансера», щоб розвести плату. Це рецепт катастрофи.

    Культурний конфлікт (Culture Clash):

    Найбільшою перешкодою часто стає глибокий культурний конфлікт (Culture Clash) між фахівцями з абсолютно різних світів. З одного боку барикад знаходиться Data Scientist, який звик працювати в комфортному середовищі Jupyter Notebook, маючи доступ до практично безлімітної оперативної пам’яті хмарних серверів та гнучкості Python. Його головна професійна мета — безперервні експерименти заради досягнення максимальної точності моделі, а будь-яка помилка в коді чи логіці вирішується простим перезапуском комірки. З іншого боку — Embedded Engineer, чия реальність складається з суворого C, жорстких апаратних обмежень (наприклад, всього 256KB RAM) та операційних систем реального часу (RTOS). Для нього найвищою цінністю є детермінізм і абсолютна стабільність системи, адже тут ціна помилки — це згоріла плата або пристрій, який завис назавжди на віддаленому об’єкті без доступу до консолі.

    Ці люди буквально розмовляють різними мовами: дата-саєнтист щиро не розуміє, чому він не може просто використати звичний формат pickle для збереження даних на мікроконтролері, тоді як ембедер не має жодного уявлення про те, що таке «градієнтний спуск» і чому заради цих математичних абстракцій потрібно жертвувати дорогоцінними тактами процесора.

    Проблема «Єдинорогів» (Edge ML Engineers): вам потрібні люди-гібриди, які розуміють і те, й інше. Вони знають, як навчити PyTorch-модель, а потім оптимізувати її споживання пам’яті, дивлячись у профайлер C++. Таких фахівців мало, і вони коштують дорого.

    Ідеальний склад мінімальної команди (The A-Team):

      Щоб створити справжню команду мрії для Edge AI, доведеться відійти від класичного розуміння ролей в IT та шукати фахівців із глибокою крос-функціональною експертизою. Замість типового дата-саєнтиста, який просто тренує моделі, вам знадобиться ML-інженер із фокусом на оптимізацію (Model Optimization). Така людина повинна не лише розуміти архітектури нейромереж, але й вільно володіти техніками квантизації (Quantization) та прунінгу (Pruning), глибоко розуміти специфіку роботи з ONNX чи TensorRT і чітко усвідомлювати, як саме перехід на INT8 вплине на падіння точності (accuracy drop) у ваших конкретних бізнес-сценаріях.

      Наступна, ймовірно найважливіша ланка — це Senior Embedded C++ Engineer. Це не просто розробник, а архітектор низькорівневих процесів, який ідеально знає Linux Kernel, вміє працювати з відеодрайверами V4L2, налаштовувати GStreamer та управляти прямим доступом до пам’яті (DMA). Саме він будує ту саму безперебійну «трубу», якою дані летять від сенсора до нейромережі в режимі реального часу і без жодного зайвого копіювання.

      Крім того, будь-який Edge-проєкт приречений без потужної інфраструктури, за яку відповідає DevOps або MLOps-фахівець. Його завдання виходять далеко за межі звичних серверних рішень: він має вміти збирати кастомні образи операційних систем через Yocto або Buildroot, налаштовувати безпечні OTA-оновлення «повітрям», вибудовувати CI/CD пайплайни для заліза та надійно керувати цілим флотом віддалених пристроїв. І, звісно, якщо ви проєктуєте власні плати, команді критично необхідний досвідчений Hardware Engineer (Electrical). Його головна місія — забезпечити ідеально стабільне живлення компонентів та грамотне відведення тепла від чипа, щоб уникнути температурного тротлінгу в закритих промислових корпусах.

      Найбільш тривожним «червоним прапорцем» (Red Flag) при формуванні такої команди є ситуація, коли всі її учасники вміють робити import tensorflow і запускати моделі в тепличних умовах, але жоден не знає, як правильно написати надійний systemd service або швидко віддебажити segmentation fault у C++ коді безпосередньо на кінцевому пристрої. З таким набором навичок проєкт ніколи не дійде до продакшену.

      Edge AI — це жорсткий мультидисциплінарний спорт. Тут перемагають лише ті компанії, де «залізячники», ембедери та дата-саєнтисти сидять за одним столом, розмовляють однією мовою і з глибокою повагою ставляться до апаратних та алгоритмічних обмежень одне одного.

      Сила інтеграції: Hardware-Software Co-Design

      Багато edge-стартапів сприймають апаратну платформу як фіксовану константу: «ми купили цей чип — тепер софт має якось запрацювати». Водночас програмне забезпечення часто розглядається як універсальний шар магії, здатний компенсувати будь-які обмеження. У реальності ж успішні Edge AI-системи народжуються лише тоді, коли «залізо» і алгоритми проєктуються одночасно. Це і є Hardware-Software Co-Design — підхід, у якому архітектура моделі, пам’ять, шини, енергоспоживання і навіть топологія плати розглядаються як єдина система.

      У серверному світі можна «перекупити» проблему — додати RAM або GPU. На Edge кожен мегабайт SRAM, кожен міліват і кожен доступ до DRAM мають ціну в грошах, теплі та автономності.

      Level 1: ілюзія прототипу

      Найповерхневіший рівень — це запуск Python-скрипта на одноплатному комп’ютері на кшталт Raspberry Pi або NVIDIA Jetson Nano. Модель експортується з PyTorch, інференс виконується через стандартний runtime, і формально все працює.

      Проблема в тому, що ігноруються базові речі: кеш-ієрархія процесора, вирівнювання пам’яті (memory alignment), NUMA-ефекти, теплопакет (TDP) і throttling. Наприклад, якщо модель активно звертається до зовнішньої DRAM замість локальної кеш-пам’яті L2, затримка доступу може зрости з ~5—10 нс (кеш) до 80–120 нс (DRAM). На мільйонах операцій це означає кратне падіння FPS.

      Ще один типовий сценарій — теплове обмеження. Якщо SoC має TDP 10 Вт без активного охолодження, то при тривалому навантаженні частота CPU може знизитися з 1.8 ГГц до 1.2 ГГц. У результаті прототип, який у лабораторії показував 20 FPS, у польових умовах стабілізується на 8–10 FPS і споживає в 3–5 разів більше енергії, ніж потрібно для тієї ж задачі при грамотній оптимізації.

      Це зона, де система «живе», але економічно й енергетично вона неефективна.

      Level 2: інженерна адаптація

      Другий рівень — це перехід від «скрипта» до системного підходу. Розробка переноситься в C++, використовуються вендорські SDK та оптимізовані рантайми. На платформах від NVIDIA це може бути TensorRT, для мікроконтролерів від Espressif Systems — ESP-IDF.

      Інженери починають враховувати особливості DMA-каналів, вирівнювання буферів під 32 або 64 байти, обмеження пропускної здатності CSI-інтерфейсу камери, реальний обсяг доступної RAM після резервування під систему. Модель квантується до INT8 або навіть INT4, що зменшує обсяг пам’яті в 4–8 разів і скорочує енергоспоживання NPU.

      На цьому рівні система вже стає придатною до масштабування. Вона не ідеальна, але контрольована. З’являється розуміння, що 5 мс затримки можуть виникати не в нейромережі, а в копіюванні буфера між kernel space і user space.

      Level 3: вертикальна архітектура

      Найглибший рівень інтеграції — це коли архітектура моделі проєктується під конкретний чип. Наприклад, якщо SoC має 2 МБ швидкої SRAM і повільну зовнішню DRAM, модель будується так, щоб проміжні тензори повністю вміщувалися в SRAM. Це дозволяє уникнути дорогих звернень до DRAM, які можуть споживати у 10–20 разів більше енергії на операцію.

      На практиці це означає зміну топології мережі: менші batch-size, глибина шарів, що відповідає розміру локальної пам’яті, fusion-операції (Conv+BN+ReLU) для зменшення кількості проходів по пам’яті. Такий підхід називають architecture-aware design.

      Ще глибший рівень — модифікація драйверів Linux для зменшення latency. Наприклад, усунення подвійної буферизації у відеопайплайні може знизити затримку з 120 мс до 70 мс. У задачах безпеки це критично, бо різниця в 50 мс може визначати, чи встигне система відреагувати в реальному часі.

      У крайніх випадках компанії переходять до кастомних FPGA або навіть ASIC. Якщо масове виробництво перевищує десятки тисяч пристроїв, інвестиція в власну логіку може зменшити споживання енергії в 5–10 разів порівняно з універсальним SoC. Саме так працюють великі виробники камер і автомобільної електроніки — вони «випалюють» критичні алгоритми безпосередньо в кремнії.

      Порівняння рівнів інтеграції


      ПараметрРівень 1: ПрототипРівень 2: ІнтеграціяРівень 3: Co-Design
      Мова / стекPythonC++ + SDKКастомний стек
      ЕнергоефективністьНизькаСередняВисока
      Контроль latencyМінімальнийЧастковийПовний
      Оптимізація під SRAMНіЧастковоПовністю
      МасштабованістьОбмеженаРеальнаСтратегічна
      Перевага на ринкуНемаєПаритетСтійка конкурентна

      Чому Co-Design — це стратегічна перевага

      Hardware-Software Co-Design — це не про «більше оптимізації», а про контроль над фізикою системи. На Edge немає абстрактного обчислення — є електрони, шини, тепловиділення й затримки доступу до пам’яті. Команда, яка розуміє, як модель взаємодіє з кешами, DMA та енергоменеджментом, може отримати кратну перевагу без зміни базової задачі.

      У результаті перемагає не той, хто має «найрозумнішу» нейромережу, а той, хто спроєктував систему цілісно — від топології шарів до трасування доріжок на платі. Саме на цьому рівні Edge AI перестає бути набором компонентів і стає інженерною архітектурою.

      Не пишіть софт для заліза. Пишіть софт разом із залізом. Виграє той, хто спускається нижче рівня API.

      Немає правильної метрики успіху: чому Accuracy — це пастка

      Edge AI стартап

      Одна з найнебезпечніших ілюзій у прикладному ML — віра в те, що висока Accuracy автоматично означає успішний продукт. В академічному середовищі домінують метрики на кшталт accuracy, mAP чи F1-score. У реальному бізнесі, особливо на Edge, ці показники часто мають слабку або нульову кореляцію з прибутковістю рішення.

      Accuracy — це агрегована статистика, яка не враховує економіку помилок, енергоспоживання, вартість апаратної платформи та операційні витрати. Модель із 99% точності може бути фінансово гіршою за модель із 95%, якщо для досягнення цих додаткових 4% потрібно втричі дорожче «залізо» або вдвічі більше енергії.

      Особливо показовим є закон спадної віддачі. На практиці підняття якості з 95% до 98% часто потребує суттєвого ускладнення архітектури: збільшення кількості параметрів, ширини шарів, глибини мережі. Наприклад, перехід від ResNet-18 до EfficientNet-B7 означає зростання кількості параметрів із приблизно 11 млн до понад 60 млн і кратне збільшення обчислювальної складності (GFLOPs). Це автоматично тягне за собою потребу у дорожчому SoC, більшій оперативній пам’яті та кращому охолодженні.

      У серверному середовищі це питання масштабується горизонтально. На Edge — ні. Якщо пристрій працює від батареї 10 000 mAh, а інференс споживає 3 Вт замість 1 Вт, автономність падає з 24 годин до 8–10. Бізнес-питання звучить жорстко: чи готовий клієнт платити $500 замість $50 за пристрій, щоб зменшити частку помилок на 1%? У більшості B2B-кейсів відповідь негативна, якщо ці 1% не мають критичного економічного значення.

      Тому зрілі edge-команди оптимізують не академічні метрики, а інженерні KPI. Нижче — спрощене порівняння двох підходів:


      Параметр«Ідеальна» модель«Раціональна» модель
      Accuracy99%96%
      Розмір моделі120 МБ18 МБ
      Споживання (інференс)3.5 Вт1.2 Вт
      SoC$40$8
      FPS1225
      MTBF200 год2000 год
      Вартість пристрою (BOM)~$150~$45

      З точки зору наукової статті перемагає перший варіант. З точки зору масового розгортання на 10 000 пристроїв — другий, оскільки він дає кращий FPS/Вт, вищу стабільність і кратно нижчу вартість масштабування.

      Окремо варто говорити про матрицю вартості помилок. У підручнику False Positive і False Negative — просто різні клітинки confusion matrix. У реальному житті вони мають різну ціну. У системі охорони периметра 100 хибних тривог за ніч через рух дерев або дощ призведуть до того, що оператор вимкне систему. Там критично важлива висока precision — мінімізація хибних спрацьовувань. Натомість у системі контролю якості на виробництві автомобілів пропуск дефекту може призвести до відкликання тисяч машин. Тут ключова метрика — recall, навіть якщо доведеться перевіряти вручну частину «помилкових» спрацювань.

      F1-score як гармонійне середнє виглядає збалансовано, але він маскує пріоритети. Якщо клієнту критично важливий лише один тип помилки, оптимізація F1 може бути стратегічною помилкою. Правильний підхід — вводити зважену функцію втрат, де помилки мають реальну грошову оцінку, наприклад: Cost = 1000×FN + 10×FP, якщо пропуск події у 100 разів дорожчий за хибну тривогу.

      Ще одна пастка — фокус на BOM (Bill of Materials) замість TCO (Total Cost of Ownership). Стартап може пишатися тим, що його пристрій коштує $100 у виробництві. Але клієнт рахує повну економіку за 3–5 років. Якщо монтаж із використанням автовишки коштує $500, мобільний трафік для передавання зображень — $10 на місяць, електроенергія — ще $15 на рік, а кожен виїзд техніка для перезавантаження завислого пристрою обходиться в $200–300, то за три роки сумарна вартість легко перевищить $1500–2000 на один вузол.

      У такій економіці навіть невелика нестабільність ПЗ (наприклад, ребут раз на два тижні) множиться на сотні або тисячі пристроїв і перетворюється на серйозні операційні витрати. Тому MTBF (Mean Time Between Failures) часто важливіший за +1% до accuracy. Так само критичними стають стиснення даних перед передачею, агрегація подій замість сирих кадрів і наявність апаратного watchdog.

      У підсумку успішний edge-продукт — це не той, що має найкращу метрику в лабораторному benchmark. Це той, що забезпечує оптимальний баланс між якістю розпізнавання, споживанням енергії, стабільністю, вартістю «заліза» та довгостроковими витратами клієнта. Accuracy — лише одна змінна в складному рівнянні. І дуже часто — не головна.

      Наостанок про Edge AI стартапи

      Edge AI стартап

      Підсумовуючи мій досвід з I-SEE та тривале спостереження за ринком, можу впевнено сказати: перехід від лабораторного прототипу до серійного Edge AI пристрою — це завжди боляче. Найскладнішою частиною шляху виявився не вибір архітектури нейромережі чи досягнення 99% accuracy на валідаційному датасеті, а побудова безперервного, відмовостійкого інженерного конвеєра.

      Ключові виклики завжди лежать у площині фізики та заліза: боротьба за кожен міліват енергії, вирівнювання пам’яті для DMA-передач, приборкання thermal throttling у закритих корпусах та створення системи, що здатна пережити раптове відключення живлення чи втрату мережі. Наш досвід підтвердив, що успіх у створенні Production-Grade систем реального часу залежить від глибокої інтеграції (Hardware-Software Co-Design). Edge AI — це не Machine Learning, а Systems Engineering з AI всередині. Виграють ті команди, де Data Scientist та Embedded Engineer розмовляють однією мовою і поважають обмеження одне одного.

      Сподіваюся, що цей розбір допоможе стартапам та інженерам уникнути «кладовища прототипів» і будувати рішення, які дійсно працюють у дикій природі.

      Відкриті питання для обговорення

      Під час роботи над Edge-проєктами ми постійно стикаємося з технічними компромісами, для яких часто немає «золотої кулі». Спільнота в Україні зараз вирішує надскладні задачі на фронті й в тилу, тому дуже цікаво дізнатися, як інші команди підходять до таких викликів:

      • Active Learning на Edge за умов дорогого трафіку: як ви визначаєте, які саме кадри варто відправляти в хмару для донавчання через LTE/супутник, коли звичайний confidence score нейромережі часто буває оманливим (overconfident mistakes)?
      • Управління «зоопарком» заліза (Hardware Fragmentation): як ви будуєте CI/CD та OTA-оновлення, коли у флоті одночасно працюють пристрої на різних ревізіях плат (Jetson, Rockchip, кастомні MCU) з різними версіями ISP та драйверів?
      • Graceful Degradation (Динамічне зниження навантаження): які патерни ви використовуєте, коли пристрій починає перегріватися на сонці (thermal throttling), але зупиняти інференс не можна? Наприклад, перемикання на легшу модель, динамічне зниження FPS тощо.
      • Zero-copy пайплайни в нестандартних середовищах: які фреймворки (GStreamer, DeepStream чи власні рішення) виявилися для вас найефективнішими для передачі кадрів від сенсора до NPU без копіювання в RAM на малопотужних SoC?

      Якщо ви пройшли через подібні кола пекла або маєте власний досвід вирішення цих задач — буду радий обговорити підходи в коментарях та обмінятися досвідом!

      Сподобалась стаття? Підписуйтесь на автора, щоб отримувати сповіщення про нові публікації на пошту.

      👍ПодобаєтьсяСподобалось19
      До обраногоВ обраному11
      LinkedIn
      Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
      Ctrl + Enter
      Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
      Ctrl + Enter
      Graceful Degradation (Динамічне зниження навантаження)

      ось це працює )

      динамічне зниження FPS

      blog.stackademic.com/...​nd-no-python-4c5b4102abd9

      Zero-copy пайплайни в нестандартних середовищах

      Та що там писати свого вела, тягнути Жстример фуфу. Srt в каналі рулить )) Ну або кошерний Zixi ))

      тоді як ембедер не має жодного уявлення про те, що таке «градієнтний спуск» і чому заради цих математичних абстракцій потрібно жертвувати дорогоцінними тактами процесора

      Ви використовуєте градієнтний спуск і під час інференсу теж, не тільки під час тренування моделі?

      Напевно, найцікавіша стаття що я бачив на цьому ресурсі за довгий час, дякую.
      Було цікаво дізнатись про наведені технічні виклики та способи їх вирішення, хоча й не маю відношення до Embedded або AI.

      Дякую за такий відгук, ми хотіли поділитись з розробниками корисним матеріалом та тим, що ми самі проходили. Секретів тут немає, але для тих хто починає свій шлях, це буде корисний матеріал і люди зможуть швидше реалізовувати свої проекти)))

      Про дебагінг — це прям дуже боляче було

      Відчуй наш біль)))
      Але той таке, саме тому, наразі робоча версія реалізована інакше)))

      Погоджуюсь з попереднім коментарем. Ковток свіжого повітря ) напевно найцікавіше що прочитав тут за останній рік. Удачі вам і дякую що поділилися

      Дякую за таку оцінку, ми сильно старались зробити шось корисне на практиці та зрозуміле.

      половину не зрозумів але дуже цікаво

      точно буду ще перечитувати

      Чекаємо тоді коментаря, коли все зрозумієте)

      дуже змістовна стаття. дякую!

      Підписатись на коментарі