Оптимізація ML-моделі (pruning) для мобільного пристрою

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Оптимізація ML-моделі (pruning) для мобільного пристрою
Складний
~3-5 днів
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    745
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1162
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    563

Оптимізація ML-моделі (pruning) для мобільного пристрою

Ми часто стикаємося з ситуацією, коли готова модель не влізає в пам'ять смартфона або працює занадто повільно. Pruning — один з ключових методів у нашому арсеналі для вирішення цієї проблеми. Це не просто видалення зайвих ваг, а тонкий процес, що вимагає розуміння архітектури та цільового пристрою. Нижче розберемо, як ми проводимо pruning під ключ, які результати гарантуємо і чому structured pruning — вибір №1 для мобільних додатків. Якщо ваша модель не вкладається в обмеження пристрою — зв'яжіться з нами, ми допоможемо.

Pruning — видалення частини ваг або нейронів з моделі. Логіка: в нейромережі, навченій на реальних даних, значна частка ваг близька до нуля і майже не впливає на вихід. Їх можна обнулити або видалити без істотної втрати точності, але з виграшем у швидкості та об'ємі.

Звучить привабливо. На практиці — pruning складніший за квантизацію, вимагає донавчання після проріджування і не завжди дає очікуване прискорення на мобільних пристроях через особливості реалізації. Наш багаторічний досвід показує, що універсального рецепту немає. Тому ми підходимо до задачі системно: спочатку аналізуємо модель, потім обираємо оптимальну стратегію.

Який pruning обрати для мобільного додатку?

Unstructured pruning — обнуляємо окремі ваги (sparse матриці). Матриця 90% нулів — здавалося б, 10× економія. Але GPU/NPU працюють з щільними матрицями, sparse обчислення там не прискорюються. Практична користь: зменшення розміру моделі після стиснення (нулі добре компресуються). Але не швидкість інференсу на звичайних пристроях.

Structured pruning — видаляємо цілі фільтри (канали) в згорткових шарах або голови в attention. Результат — фізично менший граф, який реально швидший на будь-якому залізі. Це те, що реально потрібно для мобіля.

Критерій Unstructured pruning Structured pruning
Зменшення розміру Значне (стиснення) Помірне (видалення каналів)
Прискорення на CPU/GPU Мінімальне Пропорційне видаленим каналам
Складність реалізації Низька Середня (вимагає синхронізації шарів)
Вимагає fine-tuning Так Так
Підтримка на мобільних пристроях Обмежена (рідкісні sparse-бібліотеки) Хороша (будь-який фреймворк)

Чому structured pruning ефективніший?

Structured pruning фізично зменшує граф обчислень. На мобільних пристроях це дає реальне прискорення інференсу, оскільки не вимагає спеціальних sparse-процесорів. Ми використовуємо L1-норму для ранжування фільтрів і видаляємо найменш значущі. Приклад реалізації на PyTorch:

import torch
import torch.nn.utils.prune as prune

# L1-based structured pruning: видаляємо 30% фільтрів з Conv2d шарів
# за критерієм мінімальної L1-норми (найменш важливі фільтри)
for name, module in model.named_modules():
    if isinstance(module, torch.nn.Conv2d):
        prune.ln_structured(
            module,
            name='weight',
            amount=0.3,  # 30% каналів
            n=1,         # L1 норма
            dim=0        # dim=0 — вихідні фільтри
        )

# Після pruning — важливо зробити ваги постійними (прибрати mask)
for name, module in model.named_modules():
    if isinstance(module, torch.nn.Conv2d):
        prune.remove(module, 'weight')

Після цього модель містить нульові фільтри, але вони все ще в графі. Наступний крок — фактичне видалення нульових каналів:

# Кастомна функція видалення нульових фільтрів
def remove_zero_filters(conv_layer, next_layer=None):
    """Видаляємо фільтри з нульовими вагами і синхронізуємо наступний шар"""
    weight = conv_layer.weight.data
    # Маска: фільтри з ненульовими вагами
    nonzero_mask = weight.abs().sum(dim=(1,2,3)) > 1e-6

    conv_layer.weight = nn.Parameter(weight[nonzero_mask])
    if conv_layer.bias is not None:
        conv_layer.bias = nn.Parameter(conv_layer.bias.data[nonzero_mask])
    conv_layer.out_channels = nonzero_mask.sum().item()

    # Синхронізуємо наступний шар (вхідні канали)
    if next_layer is not None and isinstance(next_layer, nn.Conv2d):
        next_layer.weight = nn.Parameter(next_layer.weight.data[:, nonzero_mask])
        next_layer.in_channels = nonzero_mask.sum().item()

Це потрібно робити обережно — BatchNorm шари після Conv також містять параметри для кожного каналу і вимагають синхронізації.

Fine-tuning після pruning

Після видалення 20–40% фільтрів модель втрачає точність. Обов'язковий етап — fine-tuning на навчальних даних. Правило: чим агресивніший pruning, тим довший fine-tuning.

# Fine-tuning після pruning — зазвичай 10-20% від початкової кількості епох
optimizer = torch.optim.Adam(pruned_model.parameters(), lr=1e-4)  # менший LR
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=20)

for epoch in range(20):
    train_one_epoch(pruned_model, train_loader, optimizer)
    val_acc = evaluate(pruned_model, val_loader)
    scheduler.step()
    print(f"Epoch {epoch}: val_acc={val_acc:.4f}")

Iterative pruning — цикл pruning → fine-tuning → pruning — дає кращий результат, ніж одноразове видалення великої кількості фільтрів.

Lottery Ticket Hypothesis: глибше

Для задач, де результат критичний, використовуємо Lottery Ticket підхід: навчаємо повну мережу, знаходимо «виграшні білети» — sparse subnetworks, які можна навчити до порівнянної точності з нуля. Реалізація через бібліотеку torch_pruning:

import torch_pruning as tp

# Аналіз залежностей між шарами
example_inputs = torch.zeros(1, 3, 224, 224)
DG = tp.DependencyGraph()
DG.build_dependency(model, example_inputs=example_inputs)

# Отримуємо групи пов'язаних шарів (pruning одного вимагає pruning пов'язаних)
pruner = tp.pruner.MagnitudePruner(
    model,
    example_inputs,
    importance=tp.importance.MagnitudeImportance(p=1),
    pruning_ratio=0.5,  # видалити 50% каналів
    global_pruning=False,
    iterative_steps=5   # ітеративно за 5 кроків
)

Чому pruning не завжди дає прискорення

MobileNetV3 вже оптимізований: depthwise separable convolutions з малою кількістю каналів. Видалити 30% фільтрів з шару з 16 каналами — отримуємо 11 каналів. Різниця у швидкості — мінімальна, overhead від tensor операцій залишається.

Pruning добре працює на великих моделях: ResNet-50, EfficientNet-B4, BERT. На вже компактних MobileNet/EfficientNet-lite — ефект нижчий. У таких випадках краще почати з легшої базової архітектури, а не прунити важку.

Комбінація з квантизацією

Pruning + квантизація — стандартна двохетапна оптимізація:

  1. Structured pruning 30–40% → fine-tuning → зменшуємо граф
  2. INT8 квантизація стиснутого графа → фінальна модель

Приклад результату: EfficientNet-B0 (20 МБ FP32, 80 мс Android) → pruning 35% + INT8 → 4 МБ, 18 мс. Точність top-1 впала з 77.1% до 75.8%.

Модель Розмір Час інференсу Top-1 точність
Вихідна (FP32) 20 МБ 80 мс 77.1%
Після pruning 35% 13 МБ 52 мс 76.5%
Після pruning + INT8 4 МБ 18 мс 75.8%

Якщо ваша модель вимагає саме таких покращень — ми готові провести повний цикл оптимізації. Зв'яжіться з нами, щоб обговорити проект.

Як ми проводимо pruning під ключ

  1. Аналіз моделі — визначаємо архітектуру, профілюємо latency та розмір.
  2. Вибір стратегії pruning — structured або lottery ticket, відсоток видалення.
  3. Ітеративний pruning + fine-tuning — 3–5 ітерацій з контролем точності.
  4. Перевірка на цільових пристроях — заміри на реальних смартфонах.
  5. Опціонально: квантизація — INT8 або FP16 для додаткового стиснення.
  6. Документація та деплой — надаємо звіт та готову модель.
Приклад використовуваних бібліотек
  • PyTorch (torch.nn.utils.prune, torch_pruning)
  • TensorFlow Lite (для квантизації)
  • ONNX Runtime (для крос-платформенного інференсу)
  • Core ML Tools (для iOS)

Що входить в роботу

  • Повний цикл оптимізації моделі від аналізу до деплою.
  • Structured pruning з fine-tuning.
  • Тестування на пристроях замовника (iOS/Android).
  • Документація щодо змін архітектури та інструкції з інтеграції.
  • Підтримка протягом 30 днів після здачі.

Наш досвід та гарантії

Наші спеціалісти мають багаторічний досвід в оптимізації нейромереж для мобільних пристроїв. Ми успішно провели pruning для 50+ проектів, включаючи додатки з мільйонними аудиторіями. Гарантуємо збереження точності в межах 2% від вихідної за умови дотримання рекомендацій щодо fine-tuning.

Оцінимо ваш проект безкоштовно — просто зв'яжіться з нами. Отримайте консультацію щодо вибору оптимального методу pruning для вашої моделі. Залиште заявку, і ми проаналізуємо вашу модель безкоштовно.

Pruning (artificial neural network) — Wikipedia torch.nn.utils.prune — PyTorch documentation

Машинне навчання в мобільних застосунках: CoreML, TFLite та on-device LLM

Ми розрізняємо два принципово різних підходи: застосунок з on-device AI та застосунок, який просто викликає хмарне API. Перший працює без інтернету, не надсилає дані користувача на сторонні сервери та відповідає за 50 мілісекунд. Другий залежить від затримки мережі та тарифного плану. Вибір архітектури — ключовий етап, який безпосередньо впливає на вартість, приватність та користувацький досвід. Наш досвід показує: у 70% проектів on-device інференс виявляється дешевшим у довгостроковій перспективі завдяки виключенню серверних витрат. Економія може сягати 40% щомісячних витрат — отримайте консультацію, ми порахуємо для вашого кейсу.

Як вибрати між CoreML та TFLite для on-device інференсу?

CoreML — нативний фреймворк Apple для запуску ML-моделей на пристрої, описаний у документації Apple. Підтримує Neural Engine (A11 Bionic та новіші), GPU та CPU як fallback. Моделі конвертуються у формат .mlmodel через coremltools з PyTorch, ONNX або TensorFlow. Конвертація — не завжди тривіальна: кастомні шари вимагають реалізації MLCustomLayer, а квантизація до INT8 іноді помітно знижує точність на специфічних даних. Ми гарантуємо, що підсумкова модель проходить валідацію на реальних даних до та після конвертації.

TensorFlow Lite — крос-платформна альтернатива для Android та Flutter відповідно до специфікації Google. На Android використовує NNAPI (Neural Networks API) для апаратного прискорення — з Android 10+ NNAPI стабільніший, до цього краще явно використовувати GPU delegate через GpuDelegate. Типова помилка: модель навчена на нормалізованих даних у діапазоні [0,1], а в застосунку на вхід подається [0,255] — інференс працює, але з безглуздими результатами без помилки. Ми включаємо модуль автоматичної валідації вхідних даних у SDK.

Для задач класифікації зображень, детекції об'єктів та сегментації доступні готові оптимізовані моделі. YOLOv8 у CoreML форматі запускає детекцію кадру 640×640 за 15–20 мс на iPhone 14 Neural Engine. MobileNetV3 на TFLite з GPU delegate — близько 8 мс на Pixel 7 при класифікації.

Параметр CoreML TFLite
Платформи iOS, macOS, watchOS Android, iOS, Linux, embedded
Апаратне прискорення Neural Engine, GPU, CPU NNAPI, GPU (OpenCL/OpenGL), CPU
Підтримка квантизації FP16, INT8 (з coremltools) FP16, INT8, dynamic range
Кастомні операції Через MLCustomLayer (Swift) Через делегати (Java/Kotlin)
Розмір бандла моделі ~3–5 МБ (MobileNetV2 quantized) ~2–4 МБ

Що робити, якщо потрібна генерація тексту на пристрої?

Запуск невеликих мовних моделей на пристрої став реальністю за останні роки. Apple Intelligence використовує власні моделі через Private Cloud Compute, але для сторонніх розробників доступні інші шляхи.

llama.cpp з Metal backend на iOS — робочий підхід для phi-3-mini (3.8B параметрів, 4-bit квантизація, ~2.3 ГБ). Інференс: 15–25 токенів/секунду на iPhone 15 Pro. Для інтеграції в Swift використовуємо Swift Package llama.swift або обгортку через C-інтерфейс llama.h. Бінарник до застосунку не додаємо — модель завантажується при першому запуску та зберігається в Application Support. Наші сертифіковані розробники налаштовують інкрементальне завантаження, щоб не блокувати перший запуск.

На Android аналог — Google AI Edge (колишній MediaPipe LLM Inference API) з підтримкою Gemma-2B. Працює через GPU delegate, на Tensor G3 чіпі Pixel 8 Pro — близько 20 токенів/секунду.

Порівняння LLM моделей для on-device
Модель Параметри Квантизація Розмір Швидкість (iPhone 15 Pro)
Phi-3-mini (Microsoft) 3.8B 4-bit ~2.3 ГБ 15-25 токенів/с
Gemma-2B (Google) 2B 4-bit ~1.2 ГБ 30-40 токенів/с
TinyLlama 1.1B 4-bit ~0.7 ГБ 60+ токенів/с

Обмеження реальні: моделі більше 4B параметрів на мобільних пристроях все ще повільні. Для складних задач міркування on-device LLM поступається GPT-4o за якістю. Гібридний підхід — on-device для коротких завдань та приватних даних, хмара для складних запитів — часто оптимальний. Оцінимо ваш кейс та запропонуємо баланс продуктивності та приватності — напишіть нам.

Інтеграція OpenAI API та інших хмарних моделей

Для сценаріїв, де cloud inference допустимий, інтеграція OpenAI, Anthropic або Google Gemini — це HTTP клієнт + streaming SSE. У Swift зручно через AsyncThrowingStream для стрімінгових відповідей. У Kotlin — через Flow.

Критично важливо: API-ключі ніколи не зберігаються в бандлі застосунку. Навіть обфускований ключ витягується з IPA за 10 хвилин через strings або frida. Правильна архітектура: мобільний застосунок → власний backend → OpenAI API. Backend контролює rate limiting, логує запити, захищає ключ.

Що входить у роботу (результати)

  • Навчена та квантизована модель під цільовий пристрій (документація за метриками)
  • SDK для інтеграції (Swift/Kotlin/Flutter) з прикладами виклику
  • Тести продуктивності на 3–5 реальних пристроях
  • Інструкція з оновлення моделі OTA
  • Підтримка при проходженні модерації App Store / Google Play (перевірка відповідності Guidelines 4.2, 5.1)
  • 2 тижні технічної підтримки після релізу

Типовий пайплайн проекту

  1. Аналіз завдання — вимірюємо latency, privacy, size, підтримувані пристрої.
  2. Прототипування моделі — в Python, оцінка accuracy на цільових даних.
  3. Конвертація та квантизація — під CoreML/TFLite з валідацією.
  4. Інтеграція в застосунок — модель обгортається в сервісний шар (легко замінювати CoreML → TFLite → хмара).
  5. Тестування — на реальних пристроях, вимір FPS, RAM, батареї.
  6. Деплой — через TestFlight / Firebase App Distribution, моніторинг метрик.

Терміни: інтеграція готової CoreML/TFLite моделі — 1–2 тижні, розробка кастомної моделі з мобільною оптимізацією — від 6 тижнів, on-device LLM чат з персоналізацією — 4–8 тижнів.

Чому ми беремося за складні кейси?

10+ років досвіду в мобільній розробці, 50+ впроваджених AI/ML рішень, гарантія сумісності з актуальними версіями iOS та Android. Всі проекти проходять code review та навантажувальне тестування. У вартість вже входить підготовка документації для модерації та навчання вашої команди.

Зв'яжіться з нами — ми допоможемо вибрати архітектуру та впровадити ML у ваш застосунок під ключ. Замовте аудит наявного рішення — безкоштовно оцінимо потенціал економії серверних витрат. Отримайте консультацію експерта — напишіть нам сьогодні.