Разработка машинного обучения (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 лет. Гарантируем совместимость модели с целевыми устройствами.
Хотите перенести модель на мобильное устройство? Получите консультацию — оценим сроки и сложность бесплатно.







