Розробка машинного навчання (PyTorch Mobile) у мобільних додатках
PyTorch Mobile менш поширений, ніж TFLite та Core ML, але виграє в певних сценаріях. Особливо коли команда data science працює на PyTorch і не хочет витрачати час на конвертацію формату, або коли вам потрібні моделі з нестандартними операціями, які TFLite не підтримує.
TorchScript: критична вимога перед розгортанням
PyTorch Mobile працює тільки з TorchScript-моделями—ні eager mode, ні torch.fx не підходять. Конвертуйте через torch.jit.trace або torch.jit.script. Різниця принципова: trace записує шлях виконання для конкретних входів і не може обробляти розгалуження, залежні від даних. script аналізує граф статично й правильно обробляє if/for, але потребує анотацій типів.
Якщо ваша модель містить if x.shape[0] > 1:, trace беззвучно записує тільки одну гілку. В production це виявляється як неправильні результати на батчах певного розміру—не краш, що ускладнює виявлення.
Після конвертації оптимізуйте через 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, але має менший бінарний розмір.
Квантизація та продуктивність
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 на своєму ноутбуку, дивується, чому модель не прискорюється на телефоні.
На практиці, приріст 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). Infer:
val module = LiteModuleLoader.load(assetFilePath("model.ptl"))
val inputTensor = TensorImageUtils.bitmapToFloat32Tensor(bitmap, mean, std)
val output = module.forward(IValue.from(inputTensor)).toTensor()
Виніс preprocessing зображення (нормалізація, ресайз) до Executors.newSingleThreadExecutor()—не на main thread.
iOS. CocoaPod LibTorch-Lite. Робота через TorchModule:
let module = TorchModule(fileAtPath: modelPath)
let result = module.predict(image: &tensorData)
Весь infer виконується на DispatchQueue.global(qos: .userInitiated).
Приклад: NLP завдання, BERT-lite для класифікації відгуків у корпоративному додатку. Команда DS працювала на PyTorch і не хотіла переконвертувати в TFLite (нестандартний attention block). Використовували TorchScript + INT8 quantization (qnnpack), розмір моделі 23 MB → 6 MB, infer на Pixel 6: 45 ms на 128 токенів. Достатньо для real-time аналітики.
Часові рамки
Конвертація та інтеграція готової PyTorch-моделі в Android або iOS: 1–2 тижні, включаючи debug TorchScript та тестування на пристроях. Вартість розраховується індивідуально.







