Розробка машинного навчання (PyTorch Mobile) у мобільному застосунку
Команда data science навчила модель на PyTorch, а тепер потрібно запустити її на мобільному пристрої. Конвертація в TFLite або Core ML вимагає переписування частини графа — часу немає, та й нестандартні операції не підтримуються. Ми допомагаємо переносити PyTorch-моделі на iOS та Android через PyTorch Mobile, зберігаючи точність і продуктивність. Наш досвід — 30+ проєктів з ML на мобільних пристроях, включаючи NLP, CV та рекомендаційні системи. Гарантуємо сумісність моделі з цільовими пристроями. Перехід на on-device інференс знижує витрати на хмарне ШІ до 70%.
PyTorch Mobile — менш поширений вибір порівняно з TFLite та Core ML, але в низці задач він виграє. Передусім там, де команда data science працює на PyTorch і не хоче витрачати час на конвертацію в інший формат. Або коли потрібна модель з нестандартними операціями, які TFLite не підтримує. Крім того, PyTorch Mobile надає єдиний API для обох платформ, що спрощує підтримку. PyTorch Mobile також підтримує квантизацію через qnnpack, що дає приріст продуктивності в 2-3 рази на операціях згортки.
Чому PyTorch Mobile, а не TFLite?
Якщо ваша модель використовує нестандартні шари (наприклад, custom attention), TFLite вимагатиме написання операторів на C++ — це тижні роботи. PyTorch Mobile приймає TorchScript безпосередньо, і багато операцій уже вбудовані. Порівняння: для BERT-lite конвертація через ONNX в TFLite зайняла б 2 дні, а через TorchScript — 3 години. PyTorch Mobile кращий для швидкого прототипування та моделей з унікальною архітектурою.
У цій статті ми розберемо, як конвертувати модель у TorchScript, оптимізувати її під мобільний пристрій за допомогою optimize_for_mobile, виконати квантизацію INT8 для пришвидшення, та інтегрувати в застосунки на iOS та Android з використанням Lite Interpreter. Також покажемо реальний кейс з BERT-lite, де розмір моделі скоротився з 23 МБ до 6 МБ, а час інференсу на Pixel 6 становив 45 мс на 128 токенів. Цей підхід дозволяє використовувати потужні моделі на мобільних пристроях без шкоди для користувацького досвіду.
TorchScript: головна вимога для PyTorch Mobile
PyTorch Mobile працює тільки з TorchScript-моделями — ні eager mode, ні torch.fx не підходять. Конвертація через torch.jit.trace або torch.jit.script. Різниця принципова: trace записує шлях виконання для конкретних входів і не вміє обробляти розгалуження залежно від даних. script аналізує граф статично і коректно обробляє if/for, але вимагає анотацій типів. Якщо модель містить if x.shape[0] > 1: — trace мовчки запише лише одну гілку. У продакшні це проявляється як неправильні результати на батчах певного розміру, а не як краш — зловити складно.
Після конвертації — оптимізація через optimize_for_mobile:
from torch.utils.mobile_optimizer import optimize_for_mobile
scripted = torch.jit.script(model)
optimized = optimize_for_mobile(scripted)
optimized._save_for_lite_interpreter("model.ptl")
.ptl (Lite Interpreter format) — це не те саме, що .pt. На мобілі використовується саме Lite Interpreter — він не підтримує всі PyTorch операції, зате має менший бінарний розмір.
Як правильно конвертувати модель у TorchScript?
Вибір між trace і script залежить від динаміки моделі. Для моделей з умовними операторами script — єдиний варіант. Ми рекомендуємо писати тести після конвертації: проганяємо модель на синтетичних даних і порівнюємо виходи до та після. Якщо розбіжність >1% — шукаємо проблемний вузол. Це гарантує, що на мобілі модель працюватиме так само, як на сервері.
Квантизація та продуктивність
Post-training static quantization для мобіля:
model.qconfig = torch.quantization.get_default_qconfig('qnnpack') # для ARM
torch.quantization.prepare(model, inplace=True)
# прогін калібрувального датасету
torch.quantization.convert(model, inplace=True)
qnnpack — бекенд для ARM-процесорів (те, що потрібно для Android та iOS). fbgemm — для x86, на мобілі не працює. Це часта помилка: розробник квантизує з fbgemm на ноутбуці, дивується, чому модель не пришвидшується на телефоні.
Чому квантизація з qnnpack, а не fbgemm?
Тому що мобільні процесори ARM використовують інструкції NEON. qnnpack оптимізований під них, fbgemm — під AVX2 на x86. Вибір неправильного бекенду призводить до нульового пришвидшення. На практиці приріст від INT8 на ARM: 2–3x на операціях типу Linear та Conv2d. На iPhone з Neural Engine PyTorch Mobile не задіює його напряму — на відміну від Core ML. Якщо потрібен Neural Engine на iOS, правильний шлях — конвертація через coremltools, а не PyTorch Mobile.
Інтеграція на Android та iOS
Android. Залежність org.pytorch:pytorch_android_lite (Lite Interpreter). Інференс:
val module = LiteModuleLoader.load(assetFilePath("model.ptl"))
val inputTensor = TensorImageUtils.bitmapToFloat32Tensor(bitmap, mean, std)
val output = module.forward(IValue.from(inputTensor)).toTensor()
Попередню обробку зображення (нормалізація, ресайз) винести в Executors.newSingleThreadExecutor() — не на main thread.
iOS. CocoaPod LibTorch-Lite. Робота через TorchModule:
let module = TorchModule(fileAtPath: modelPath)
let result = module.predict(image: &tensorData)
Весь інференс — у DispatchQueue.global(qos: .userInitiated).
Приклад: NLP-задача, BERT-lite для класифікації відгуків всередині корпоративного застосунку. Команда DS працювала на PyTorch, переконвертувати в TFLite не хотіли (нестандартний attention block). Використали TorchScript + INT8 quantization (qnnpack), розмір моделі 23 MB → 6 MB, інференс на Pixel 6 — 45 ms на 128 токенів. Достатньо для realtime-аналітики.
| Параметр | PyTorch Mobile | TFLite | Core ML |
|---|---|---|---|
| Підтримка нестандартних операцій | Так, якщо є реалізація | Обмежено | Обмежено |
| Розмір бінарної бібліотеки | ~3 МБ (lite) | ~1.5 МБ | ~2 МБ |
| Пришвидшення Neural Engine | Ні | Так (Android NN API) | Так (ANE) |
| Конвертація з PyTorch | Нативна TorchScript | Через ONNX | Через coremltools |
| Пристрій | Час інференсу FP32 | Час інференсу INT8 | Пришвидшення |
|---|---|---|---|
| iPhone 12 | 120 мс | 45 мс | 2.7x |
| Pixel 6 | 140 мс | 50 мс | 2.8x |
| Samsung S21 | 130 мс | 48 мс | 2.7x |
Як ми працюємо: від аналізу до деплою
- Аналіз моделі — оцінюємо граф, операції, розмір. Виявляємо проблемні вузли для TorchScript.
- Конвертація та оптимізація — пишемо скрипт конвертації, тестуємо на десктопі, потім оптимізуємо
optimize_for_mobileта квантизуємо. - Інтеграція в застосунок — підключаємо Lite Interpreter, пишемо обгортку для інференсу на головному потоці не блокуючи UI.
- Тестування на пристроях — перевіряємо коректність виходів (порівняння з оригінальною моделлю), заміряємо продуктивність, температуру, споживання пам'яті.
- Деплой та моніторинг — завантажуємо в App Store / Google Play, використовуємо Firebase для збору метрик. При оновленні моделі — тільки заміна model.ptl.
Що входить в роботу
- Повна документація з конвертації та інтеграції (включаючи troubleshooting).
- Вихідний код інтеграції для iOS (Swift) та Android (Kotlin).
- Інструкція з оновлення моделі без перескладання застосунку.
- Підтримка при релізі в стор (вирішення проблем з рев'ю, якщо модель порушує правила).
- Гарантія сумісності з iOS 15+ та Android 12+.
Терміни та вартість
Конвертація та інтеграція готової PyTorch-моделі в Android або iOS — 1–2 тижні з урахуванням налагодження TorchScript та тестування на пристроях. Вартість розраховується індивідуально. Зв'яжіться з нами для оцінки вашого проєкту — надішлемо приблизний час та бюджет.
Типові помилки при інтеграції PyTorch Mobile
- Використання fbgemm для квантизації замість qnnpack.
- Забули зберегти модель у форматі Lite Interpreter (.ptl).
- Інференс на головному потоці — призводить до зависання UI.
- Не перевірили, що модель не використовує непідтримувані операції (наприклад, torch.einsum може бути відсутнім).
- Не врахували розмір моделі при завантаженні — великі моделі (>50 МБ) можуть вивантажуватися з пам'яті.
Ми займаємося мобільною розробкою з моменту виходу PyTorch Mobile і реалізували 30+ проєктів з інтеграцією ML. Досвід роботи — понад 5 років. Гарантуємо сумісність моделі з цільовими пристроями.
Хочете перенести модель на мобільний пристрій? Отримайте консультацію — оцінимо терміни та складність безкоштовно.







