Распознавание объектов на грани

Использование PyTorch, ONNX, WebAssembly и sclbl-webnode для развертывания моделей распознавания объектов непосредственно в браузере.

Распознавание объектов было сложной задачей машинного обучения на протяжении десятилетий. Тем не менее, был достигнут значительный прогресс, причем некоторые даже предполагают, что мы закончили с распознаванием объектов. Я думаю, что мы никогда не закончили, но к настоящему времени у нас есть несколько замечательно работающих, предварительно обученных моделей, которые доступны нам напрямую. Все больше и больше таких предварительно обученных моделей доступно в формате ONNX. В этом посте мы покажем, как мы использовали PyTorch, ONNX, WebAssembly и sclbl-webnode для развертывания распознавания объектов прямо в браузере. В итоге это выглядит так:

Обратите внимание, что это выполняется локально: сама модель загружается с серверов только один раз в Scailable, и изображение никогда не покидает компьютер пользователя (с некоторыми очевидными преимуществами конфиденциальности). Вы можете поиграть с приложением на странице https://www.scailable.net/demo/cifar/.

Как это было построено

Хотя распознавание объектов на грани может показаться сложной задачей, создание интерактивной демонстрации заняло менее часа.

  1. Сначала мы взяли предварительно обученную модель распознавания объектов. Мы выбрали версию ResNet, предварительно обученную на наборе данных CIFAR10. Вы можете найти модель здесь.
  2. Исходная модель была в формате PyTorch (.pht), поэтому мы преобразовали ее в ONNX…

«ONNX определяет общий набор операторов - строительных блоков моделей машинного обучения и глубокого обучения - и общий формат файлов, позволяющий разработчикам ИИ использовать модели с различными фреймворками, инструментами, средами выполнения и компиляторами».

3. Затем мы загрузили ONNX в Scailable, чтобы преобразовать его модель в двоичный файл WebAssembly:

4. После преобразования двоичный файл WebAssembly доступен как конечная точка REST и может быть загружен для развертывания на различных периферийных устройствах (мы запускали модели AI на плате ESP32 MCU с использованием WebAssembly). Для развертывания в браузере мы использовали sclbl-webnode: проект javascript с открытым исходным кодом, реализующий чрезвычайно маленькую среду выполнения WebAssembly.

5. В то время как завершение демонстрации потребовало немного дополнительных .js для создания столбчатой ​​диаграммы внизу, фактический вызов для распознавания объекта потребовал очень мало кода:

let inputData = "{\"input\": \"" + base64string + "\", \"type\":\"image\", \"norm\":[0.4914, 0.2023, " + "0.4822, 0.1994, 0.4465, 0.2010], \"width\":32, \"height\":32, \"channels\":3, \"crop\":true }";
sclblRuntime.run(inputData).then(function(response) {
  document.getElementById("output-integers").innerHTML = response;
  showResults(response);
}, function(error) {
  document.getElementById("output-integers").innerHTML = "An error occurred (see console for more details): " + error;
});

Вы можете найти подробную информацию о переходе от PyTorch к ONNX для этой конкретной модели здесь, а sclbl-webnode подробно объясняется здесь.

Почему именно WebAssembly (в отличие от среды выполнения ONNX.js)?

Хотя очевидно, что демонстрация работает как шарм, можно задаться вопросом, почему мы испытываем трудности с переносом модели ONNX в двоичный файл WebAssembly: нельзя ли просто использовать среду выполнения javascript ONNX (ONNX.js)?

Что ж, в то время как ONNX.js (и аналогично для сред выполнения ONNX, доступных для других периферийных устройств) может показаться простым, он позволяет пропустить этап WebAssembly, время выполнения ONNX часто и значительно больше, и медленнее в исполнении. В этом конкретном примере .wasm и .onnx, используемые для указания модели (в случае .wasm фактически включая необходимые операторы), оба занимают около 1 МБ (1069 КБ) для хранения. Время выполнения, однако, сильно различается по размеру: onnx.min.js, который можно найти здесь, весит более 430 Кбайт, а sclbl-webnode-min.js (здесь) - менее 10 Кбайт. Время выполнения также существенно различается: мы находим ~ 164 миллисекунды (оценка на основе 1000 прогнозов) для реализации .wasm и ~ 420 миллисекунд для реализации .onnx.

Увеличение размера и скорости (и, по общему признанию, повышение удобства использования, поскольку для многих периферийных устройств среды выполнения ONNX гораздо менее развиты, чем среды выполнения WebAssembly) могут иметь решающее значение для многих приложений. Их также легко понять:

  • Среда выполнения ONNX эффективно поддерживает все ONNX. Входными данными для задачи вывода на грани будут спецификация модели (файл .onnx) и данные (например, изображение); оба обрабатываются до генерируемых выводов. Для этого в среде выполнения должны быть реализованы все возможные операторы ONNX.
  • Задача вывода, перенесенная в WebAssembly, работающую в среде выполнения WebAssembly, только принимает входные данные в качестве входных. Он только содержит операторы, необходимые для выполнения поставленной задачи. Среда выполнения запускает общую WebAssembly и не требует обработки файла ONNX.

Таким образом, хотя среда выполнения ONNX является общим инструментом для запуска всех видов моделей, процесс переноса моделей в WebAssembly предоставляет специализированный и высоко оптимизированный двоичный файл для каждой конкретной модели. Поскольку транспилирование должно происходить только один раз, преимущества на грани довольно разительны.

«WebAssembly (сокращенно Wasm) - это двоичный формат инструкций для виртуальной машины на основе стека. Wasm разработан как переносимая цель компиляции для языков программирования, позволяющая развертывать в Интернете клиентские и серверные приложения ».

Заворачивать

Надеюсь, вам понравился этот пост и / или понравилось поиграть с интерактивной демонстрацией. Вместе с масштабируемой учетной записью описанные выше шаги должны позволить вам продвинуть свои собственные модели искусственного интеллекта и машинного обучения на передний план.

Отказ от ответственности

Приятно отметить мое личное участие здесь: я профессор Data Science в Jheronimus Academy of Data Science и один из соучредителей Scailable. Таким образом, без сомнения, я кровно заинтересован в Scailable; Я заинтересован в том, чтобы он разрастался, чтобы мы наконец смогли внедрить ИИ в производство и выполнить свои обещания. Высказанные здесь мнения являются моими собственными.