Научно-технический вебинар “Перенос нейросетей, работающих с изображениями, на мобильные устройства”
21 июля 2020, 18:00 МСК

О ВЕБИНАРЕ

Спикер
Сергей Чичерин, Senior Engineer, Samsung AI Center
Тема
Научно-технический вебинар “Перенос нейросетей, работающих с изображениями, на мобильные устройства”
Подробнее про вебинар

В докладе описаны разные архитектуры для запуска нейросетей на мобильных девайсах, рассмотрены методы ускорения нейросетей на устройствах и типичные проблемы с переводом моделей на устройства. В качестве примера запустили модель на телефоне.

_ _ _

Запись прошедшего вебинара: https://youtu.be/3k9uHUkOSN8

Материалы:

Про производительность http://ai-benchmark.com/

Примеры TF Lite https://www.tensorflow.org/lite/examples 

EfficientNet https://arxiv.org/pdf/1905.11946.pdf 

Model optimization https://www.tensorflow.org/lite/performance/model_optimization

(00:00:00) (Начало записи) 

Сергей Чичерин: Добрый день, уважаемые коллеги. Меня зовут Сергей Чичерин. Я попытаюсь рассказать, возможно, даже показать разные варианты того, как можно использовать мобильное устройство для запуска нейронных сетей. Моя цель, здесь воодушевить и вдохновить вас для использования мобильных девайсов в качестве платформы для запуска нейронных сетей. 

Допустим, у вас есть замечательная сеть, которая выполняет какую-то задачу, например стандартную задачу в компьютерном зрении, это классификация, сегментация, возможно, какие-то генеративные задачи, возможно, задачи, которые связаны с восстановлением или модификацией изображений. Также может быть ряд других задач, например с текстами и аудио. 

Допустим, у вас есть рабочая модель, которые вы используйте, вы хотите как-то это решение претворить в жизнь. По сути, у вас несколько вариантов. Один из вариантов – это соорудить большую серверную платформу, которая выводит (inferring)  ваши сети, и вы можете их запускать, отсылая данные на сервер, и получая обратно ответ. Это очень дорого, это достаточно сложно и, возможно, третья проблема, с которой вам в таком случае предстоит столкнуться, это с тем, что, часть этих данных пользователи не хотят отсылать на сервер, есть различные законы о персональных данных, GDPR, о том, что вы не можете без разрешения отослать фотографию на сервер. Вы должны подтвердить, если это имеет отношение к персональным данным. При запуске сети локально на мобильных соблюдается приватность, не требуются внешние ресурсы и программы, и возможно получить быстрый отклик, там где это нужно.

 Какие минусы запуска нейросетей на мобильных устройствах? Возможность запуска появилась сравнительно недавно, буквально 2-3 года назад. До этого те фреймворки, которые использовались, позволяли запускать нейросети на мобильных устройствах, но исключительно в режиме какой-то эмуляции, без поддержки со стороны железа. Несколько лет назад появились первые устройства, прежде всего, это Apple iPhone, Huawei P 20 и прочие,  устройства на базе Qualcomm, в которые встроен ускоритель для запуска нейросетей. Поэтому когда у нас есть готовое решение на базе нейросети, которое что-то делает, мы не можем его запускать на телефоне без отрыва от того, насколько быстро это будет работать, насколько вообще возможно, что оно будет работать, насколько мы можем адаптировать это для данного устройства. 

Это очевидный минус, который присутствует в данной технологии. Технология достаточно свежая, но достаточно популярная, и поэтому, возможно, мы можем ожидать какое-то будущее за этой технологией.

(00:04:55)

Я немножко расскажу про какие-то платформы, может быть, показывая выдержки из статей, и затем мы попробуем запустить какую-то нейросеть и сконвертировать ее для мобильного устройства. Учитывая то, что количество платформ огромное, а количество нейросетей, количество того, что можем запустить, тоже, я попробую ограничиться минимально рабочим вариантом MVP.

Платформы. Допустим, у нас есть какое-то мобильное устройство, с поддержкой запуска нейросетей. Что представляет из себя его архитектура, так называемая system on a chip (SoC)? В мобильном устройстве есть, так же, как и в обычном компьютере, CPU - Central Processor Unit, GPU - графический ускоритель, периферийные контроллеры. Далее, появились в мобильных устройствах ускоритель для запуска нейросетей, NPU, и также есть другие ускорители, которые в зависимости от платформы, в зависимости от вендора, тоже позволяют ускоренно запускать нейросеть. Также присутствуют сигнальные процессоры DSP, которые   на некоторых платформах могут работать как ускорители для нейросетей.

По опыту запуска нейросетей на компьютерах мы знаем, что GPU, конечно, работает значительно быстрее, чем CPU. Для мобильного устройства, для телефона это, пожалуй, даже более критично, потому что мы ожидаем какой-то производительности от телефонов для того, чтобы выполнять какие-то задачи.

Например, типичная сеть для распознавания, она может занимать сотни мегабайт, и несколько миллиарда операций (GFLOPS), которое мы не всегда можем позволить себе на мобильном устройстве. Отсюда всевозможные ухищрения,специальные сетки для мобильных устройств, бенчмарки и методы для того, чтобы впихнуть данную сеть на мобильное устройство. 

Существует одно из интересных исследований про performance мобильных устройств, правда, к сожалению, оно только для Android, называется AI Benchmark http://ai-benchmark.com. Создатели сделали несколько сетей и запустили на разных устройствах, и в зависимости от устройства мы видим ускорение производительности, насколько быстро это работает. Они провели некоторое исследование и написали статью, которая постепенно обновляется в связи с развитием платформы. Уникальность этой статьи в том, что они написали ее в содружестве с вендорами из Qualcomm, Samsung, Huawei и, таким образом, есть какая-то возможность сравнивать платформы System-on-a-Chip и сравнивать их производительность.

Какой типичный сценарий запуска нейросети на мобильном устройстве? Допустим, у нас есть какое-то одно определенное устройство, а мы хотим, чтобы она запускалась только на нем. Это идеальный вариант, в таком случае мы можем даже воспользоваться SDK, который предоставляет вендор, в случае, например, Qualcomm это SNPE, в случае Huawei HiAI, для Apple MLCore, подразумевая, что данная сеть работает максимально быстро. Данные инструменты могут включать в себя также возможность профилирования.

(00:10:12)

Но, чаще всего нам хочется, чтобы эта сеть работала скорее на всех платформах, и включая Apple тоже. Поэтому мы идем с другой стороны. Есть две замечательные библиотеки, которые стараются поддерживать запуск нейросетей. Это TF Light, то есть TensorFlow Light, это подпроект TensorFlow, которая, по сути, берет вычислительный граф из TensorFlow, и затем его преобразует, оптимизирует, и далее запускает на мобильное устройство в новом формате. В чем отличие запуска модели на устройстве, используя TensorFlow Light, или же PyTorch Mobile, соответственно, от запуска обычной сети на компьютере? Во-первых, у нас нету backward, то есть там чаще всего реализован сценарий, когда у нас есть фиксированный вход, то есть, условно говоря, тензорное произведение 3 X 224 X 224, и у нас нет возможности доступа к каким-то различным операциям, которые есть в стандартном TensorFlow, или которые мы можем сделать, используя PyTorch, потому что TF Light – это отдельная библиотека, которая поддерживает лишь какой-то набор операций. Посредством интерфейса Android NNApi операции запускаются на GPU и CPU мобильной платформы.

То же самое с Apple CoreML. 

Существует ONNX формат для запуска сетей. Он содержит наборы операций и возможности конвертации, но при этом он не более распространен, чем другие

Каким образом мы еще можем ускорить нейросеть? По опыту мы знаем, что если сеть тренируется, например, на 32битных числах с плавающей точкой fp32, то мы можем снизить разрядность тех чисел в сети, которые используются, и понизить ее до fp16(квантизация), например, а чаще всего понижение до fp 16 не меняет производительность, не ухудшает performance, довольно слабо влияет на метрики, поэтому  чаще всего мы можем сделать Tensor Flow cast на fp16 или в PyTorch просто написать .float() Что произойдет? Мы убираем числа после запятой, некоторое количество разрядов, и получается модель значительно меньшего разрешения, то есть она в два раза меньше, и, соответственно она гораздо более производительная. Более того, она более производительная, потому что, может так случиться, что графический ускоритель на телефоне, например, более поддерживает ускорение в fp16. 

 Рассмотрим стандартный пример, который приведен в PyTorch Mobile, где рассказывается про то, что мы берем модель, которая, улучшает изображение, и затем ее преобразуем во что-то, чтобы затем запустить на телефоне. Модели, работающие в таком ключе с изображениями вполне могут работать на fp16. 

(00:15:00)


Что касается фреймворков, во-первых, стоит ли говорить о том, что классически есть два способа разделения записи тензорного произведения от массивов тензоров. В одном случае канал идет в начале, например, 3, 224, 224, в другом конце 224, 224, 3. Один используется в Tensor Flow, соответственно, Tensor Flow Light, другой в PyTorch и Caffe. Соответственно, эта разница между фреймворками, из-за этого возникает некоторая проблема, связанная с тем, что данная конвертация между фреймворками сильно затруднена. Поэтому, имеет смысл чаще всего запускать, тренироваться на одном фреймворке.

Когда мы квантизируем до 16 бит, все отлично и хорошо, если мы пытаемся уменьшить квантизацию и, например, сделать ее восьмибитную, тут и появляются некоторые проблемы. Понятно, сильно выигрываем в производительности. Во-первых, когда квантизируется модель 8-битная, мы уже переводим в int, то есть мы значение из float, то есть числа с плавающей точкой, мы переводим в целочисленные. Например, мы берем самое большое, самое маленькое значение, затем их преобразуем в int-значение и растягиваем это вдоль промежутка и получаем какую-то целочисленную математику. Возможны проблемы с переполнением. Эти же проблемы возможны при тренировке, например, если мы тренируем модель не в fp32, а fp16,  допустим, большинство слоев работает нормально, но, например, batch norm то есть нормализация, когда мы вначале все складываем и умножаем, вполне возможно, получится так, что мы потеряем лишние значения. 

Поэтому при тренировке чаще всего... Раньше делали как? Брали, тренировали все в double, а потом как бы квантизовали, отдавали в 16-битные или 8-битные числа. Иногда для ускорения тренировки  сейчас используют все-таки тренировку fp16, есть замечательный проект у NVidia, который называется apex, который позволяет достаточно легко декларативно написать, чуть-чуть поменяв train loop, сказав, что мы хотим изменить, уменьшить разрядность и увеличить скорость, при которой тренируется. Особенно это хорошо работает на новых платформах, на NVIDIA Turing, (00:18:58) и мы меняем opt-level, то есть O1 означает то что по дефолту

 O2, как раз означает то, что мы оптимизируем те слои, которые работают нормально, мы их запускаем на пониженном разрешении, то есть во fp16, а, например, батч-нормы мы запускаем как обычно. Внутри этого фреймворка стоят конвертеры, которые конвертируют между, например, fp 16 и fp 32 на каких-то слоях. 

Так, теперь, когда мы квантуем до 8 бит или даже менее. В принципе, можно и менее. Вот, например, какая-нибудь прекрасная статья про то, как можно квантовать в гораздо меньшее количество бит, и это отлично все работает, потому что, допустим, у нас есть дальше классификации, то есть мы используем сжимающее отображение

(00:20:02)

По сути, это какое-то сильное понижение размерности, то есть мы из пространства 224 на 224 на 3 переходим в 1000 классов и, наверное, можно придумать какое-то отображение, которое при этом достаточно похоже на оригинальное, даже используя такую пониженную арифметику.

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

Проблемы возникают не только во время training loop, то есть когда мы проходим forward, backward, но еще проблема в inference, то есть когда мы уже запускаем готовую сетку, потому что если мы каким-то образом квантизируем, то есть отсекаем эти данные, то получается накапливание ошибок. Отсюда появляется такой замечательный механизм, который называется quantization aware training. Это про то, что мы во время тренировки делаем следующее: сравниваем результаты, полученные от нормальной сети, и от сильно ужатой. Когда мы их сравниваем, мы должны понять, что ошибки округления не приводят к ошибкам, тем лоссам, которые возникают в результатах. В целом это примерно так. 

Теперь про какие-нибудь классические сети. Чаще всего рассматривают классификационные сети, потому что это изученная проблема, и мы можем посмотреть бенчмарки на них.

Первая сеть, которая делает классификацию на мобильных устройствах, это всем известная MobileNet, она появилась сравнительно недавно. Что авторы сделали? Взяли типичный блок для сверток, который, например, ядро 3X3, batchnorm и ReLU, они заменили depthwise сверткой, а далее  depthwise, используя ядро 1 на 1, это pointwise-свертки, которые, в принципе, работают примерно схоже, но они значительно быстрее, потому что там могут быть группы или еще что-то. В следующих поколениях mobile.net, например, заменили ReLU на ReLU6, то есть выпрямитель стали ограничивать, например, 6 для того, чтобы при квантизации в int-значение у нас не возникало такого переполнения, то есть все значения находились в каком-то промежутке, достаточно ограниченном. 

Затем появилось целое поколение других сетей. В принципе, сейчас state of the art задач распознавания – это EfficientNet, для поиска которого (00:24:16) использовали network architecture search, то есть искали используя алгоритмы для перебора архитектур. Наверное, у нас не так много времени, я не буду останавливаться на этом. Если вдруг вам требуется разрабатывать самим архитектуру нейросети, имеет смысл смотреть на те блоки, которые присутствуют в этих сетях, потому что они с доказанной производительностью работают. 

(00:24:55) 

Если посмотреть на известный график по image classification,, кажется, что  больше нескольких gflops мы уже не можем запускать на мобильных устройствах, то есть порог отсечения где-то в районе EfficientNet b3. Поэтому мы и используем какие-то сильно измененные архитектуры.

Процедура следующая. Мы берем, тренируем обычную модель, возможно, включаем quantization aware training, это тот способ, когда мы добавляем ошибку округления в общую ошибку, то есть таким образом сеть тренируется, что при дальнейшем округлении мы не сильно теряем. Затем мы переносим ее на ту архитектуру, которая может запускаться на телефонах. Соответственно, в случае PyTorch или Caffe это, например, ONNX, и дальше... 

ONNX – это формат для обмена весами и операциями в нейросети.

Раньше думали, что этот формат будет распространен, и все будут им пользоваться, но на самом деле, он, к сожалению, поддерживается слабо...все равно мы не можем так легко конвертировать из него во что-то другое, но, тем не менее, это одна из попыток индустрии собрать какой-то один формат для конвертации данных. Затем переводим его в какую-то сеть в зависимости от платформы. Например, команда TensorFlow Light сделала гигантские усилия по тому, чтобы вы могли сеть запускать на разных устройствах. В зависимости от устройства мы можем выбрать тот способ, как мы можем запускать. В одном случае мы можем запускать на CPU, на CPU большинство операций поддерживается, и все замечательно, можем запускать на GPU, и можем запускать, если есть возможность, на NPU. Кроме того, например, если рассматривать Android, то та прослойка Android, которая называется NN API, она автоматически позволяет это определить, поддерживает ли данное устройство ускоритель или нет. 

Давайте посмотрим какой-нибудь пример типичный, то есть вот, например, типичный пример запуска классификационной сети на Android. Что у нас есть? В принципе, это есть стандартный пример приложения на TensorFlow Light, которое запускается. Это классификация, она запускает несколько сетей. Здесь подключена камера, уже готовый код, который, например, считывает что-то с изображения, преобразует его в тензор, именно таким, способом. Но надо понимать, что то, что написано на Java, там даже форматы чисел другие, то есть littleendian против bigendian, (00:29:09) то есть он преобразует для формата данных, который запускает на TensorFlow Light. Так, тут, наверное, это какой-нибудь абстрактный класс. 

Способы применения. Здесь сразу две сети, реализованы вызов, EfficientNet и MobileNet. соответственно, когда мы подаем изображение, мы вычитаем из него среднее и делим на отклонение, и затем запускаем сеть.

(00:29:58)

Сейчас, формат данного файла tflight. В каком-то виде (Netron) мы можем посмотреть фиксированный input т 224 на 224 на 3, затем цепочка таких блоков, о которых я говорил. Здесь разные форматы. С помощью средств командной строки мы можем преобразовать один формат в другой, это все есть в документации, то есть когда мы берем TF Light и конвертер, то, например это можно сделать при помощи кода. Мы берем обычную модель, в случае Tensor Flow это либо Keras модель, либо замороженный граф. Затем tflight конвертер что делает? Он делает несколько достаточно умных вещей, помимо всего прочего, он оптимизирует граф для запуска. Например,  у нас есть в конце блока batchnorm, он может, например, сделать fused batchnorm, так как он для запуска. то есть эти умножения, сложения, их добавить в свертки, и получится fuse block. 

В заключение я хотел показать,  как запускается эта сеть, но тут ничего, на самом деле, тоже интересного нету. Я,  скачал с Kaggle какой-нибудь набор данных, который запускает,  какую-нибудь классификацию, то есть не просто готовую сеть, а, к примеру, она классифицирует по фотографии родинки определяет тип заболевания. То есть, возможно, эта родинка, например, какое-то заболевание. Вам будет интересно попробовать какую-то обычную классификационную сеть. 

Я буквально только скачал все эти данные, затем запустил какой-то готовый ноутбук, и единственное, что здесь поменялось, это механизм преобразования файлов. Это стандартный Transfer Learning, то есть мы берем какую-то готовую сеть, и пытаемся преобразовать ее для наших нужд. Инициализация на PyTorch, соответственно, в вашем случае что-то будет по-разному, какой-то список классов. Мы читаем эту базу данных.

Изменение следующее. Я подключаю сюда EfficientNet, то есть я запускаю модель, которая не достаточно тяжелая, которая используется для классификации, а вот используя EfficientNet. Тут тоже Depthwise Separable Convolution и ReLU6, и затем вот такие стандартные блоки, и затем обучаю уже ее. В случае quantization aware training мне нужно будет добавить несколько блоков, которые добавляют ошибку квантизации, если я вдруг модель квантизирую. 

В принципе, она как-то обучается, где-то тут есть, абсолютно без изменений, что-то там происходит, можно ее поставить дальше обучаться. Затем мы можем что сделать? Затем мы можем перенести ее на мобильные устройства. Так, как показать, не видно... Можно подключить кабель, затем, например, в случае Android я увижу, что это ADB Devices, наверное, где-то этот девайс должен появиться. Затем он появляется здесь. Я запускаю обучение, копирую модель и заменяю ее здесь нужной моделью, то есть конвертирую в tflight, заменяю здесь нужной моделью, и запускаю. Вот запустилась, и он как-то классифицирует. Понятное дело, что так как сами данные взяты не из сотового телефона, а из каких-то других картинок, тут вряд ли она идеально будет работать... тут согласно теореме об отсутствии бесплатных завтраков перенос домена на картинке с мобильного может не сработать и может не сработать куча вещей, но, общий принцип перенос сетей такой.

(00:35:08)

Ведущий: Видите, у нас есть несколько вопросов от участников.

Сергей Чичерин: Ага, давайте.

Ведущий: Некоторые из них более ли менее очевидны...

Сергей Чичерин: Давайте, сейчас по очереди. Я не понял про книжку.

Ведущий: Это про вашу статью на экране комментарий был.

Сергей Чичерин: Да, наверное, просто как-то не очень интересно пересказывать статьи, я просто их пришлю, весь список, который нужен, хотя бы про которые я говорил. 

Затем... Да, недавно появилась возможность запуска PyTorch на мобильных устройствах, этот проект называется PyTorch Mobile. Они еще не добавили возможность запуска на GPU, то есть это только в процессе, поэтому это не так быстро. Но при этом то, как он работает на CPU, то есть на всех устройствах, достаточно быстро, потому что они используют замечательную библиотеку QNNX, которая достаточно хорошая и быстрая. Соответственно, да, PyTorch Mobile Android, там как раз пример, как на Android.

На TensorFlow, в зависимости от того, что... Сложности там, если, например, люди все время делали на TensorFlow, сказать им, как на PyTorch. Проект Android на GitHub, это просто тэфлайтовский проект и example, то есть это пример, где он расположен... Там куча примеров в TF Light, я взял image classification, но буквально поменял пару строчек и соответственно саму модель. В общем, какие-то навыки Android-программирования, наверное, нужны, чтобы помеcтить (00:37:09) заставку и  убыстрить диалог, но в целом, эти примеры, они прямо из коробки, когда мы меняем модель. 

Про операции. Смотрите, есть операции, во-первых сегментации, то есть сегментацию можно по-разному проделать, PyTorch Mobile основан на... то есть он, в принципе, включает в себя набор операций из ONNX, и там может чего-то не быть, но мы можем как-то это заменить, то есть нет такого, что мы не можем это запустить. Но PyTorch Mobile – это более свежая, более незрелая разработка, поэтому, в общем-то, сейчас, конечно, все ориентируются на TF Light. Но, есть конечно еще и решения от вендоров, есть, от SNPE для Qualcomm, или Apple ML Core. Про них достаточно сложно говорить. Кажется, что общее решение, пусть не самое быстрое, но определенно хорошо работающее на разных девайсах, на наиболее большом спектре девайсов, это TF Light.

Ведущий: У меня еще есть вопрос. Вообще говоря, теоретически есть три основных направления, с помощью которых ужимаются, утаптываются нейронные сети. Одно из них квантизация, другое из них дистилляция, и третье – малоранговые и тому подобные аппроксимации. В основном вы сегодня говорили про квантизацию, а про дистилляцию и малоранговые аппроксимации, в общем-то, не говорили. Значит ли это, что в суровой практике упаковывания нейронных сетей в мобильные телефоны эти подходы почти не встречаются, и в основном вы добиваетесь своих результатов с помощью квантизации?

Сергей Чичерин: Смотрите, дистилляция как подход обычно... Как я для себя понимаю, это тот способ, когда мы берем какую-то большую сеть, и пытаемся результаты, полученные от большой сети воткнуть в малую. Та малая сеть, которая получена... Это способ обучения сети с меньшим количеством параметров, один из способов обучения.

(00:39:58)

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

Ведущий: У нас участники еще назадавали вопросов.

Сергей Чичерин: Так, ага. Про перспективы нейросетей... Выгода в цене... Сейчас. Кто платит-то? Платят пользователя, платят разработчики. Не совсем понятно... Пользователям, конечно, нужна какая-то интерактивность, например, что-то сфотографировал, и сразу получил результаты, и при этом не куда-то там отсылается, на сервер или еще что-то. Какая-то интерактивность, возможно, в AR каких-то приложениях. Я не очень знаю про текстовые приложения на телефонах, но, наверное, там тоже какая-то большая активность ведется. 

Так. «Что почитать, за чем следить?» Можно читать, можно следить, можно этот пример, который я рассказал, как-то добить, то есть взять какую-то задачу, классификации, еще какую-то, какая вам интересна, и попробовать развить это. Не знаю, может быть это мне кажется, но теперь перенос нейросетей на мобильные телефоны перестал быть таким очень сложным. Там есть свои проблемы, но как будто бы достаточно несложно. 

«У кого есть конвертер TF-моделей в код, который запускается на NPU?» «Нужен ли конвертер, или задействовать TF Light?» Смотрите, TF Light, в принципе, может запускать что? Он может запускать NN API. Раньше так было, что NN API – это часть Android, операционной системы, которая говорит, что «вот я могу запустить часть нейросети на данном устройстве», и это достаточно прозрачно. Соответственно, TF Light может... Например, грубо говоря, есть какой-то участок кода, сейчас я его открою, то, что мы просто выбираем... Вначале в блоке инициализации мы проверяем, какие девайсы присутствуют, и далее здесь модель, то есть мы в зависимости от этого запускаем нужную модель, то есть если GPU, то такое, если еще какое-то, то другое. Там есть какая-то инициализация блока, которая связана с NN API, и раньше это было... Сейчас, может быть, поменялся синтаксис, но раньше это было так, что мы можем... проверка, мы можем запустить этот блок NN API, и если можем, то, например, мы ее запускаем, нейросеть, на нужном устройстве. 

Вообще говоря, у производителей «железа» есть конвертеры, которые именно запускаются прямо на самом железе. Это то же самое, SNPE Framework и Qualcomm – это примерно тот же аналог, наверное, того же конвертера, который берет TF-модель и конвертирует в SNPE, но в таком случае вам нужно взять программный интерфейс каждого вендора, и конвертировать для каждого вендора, то есть, по сути, проделать работу, которую проделывает скромная команда TF Light в Google, достаточно тяжело. 

«Получается что на мобильниках сейчас нормально с GPU, можно работать...» Да, с GPU и даже с NPU. Отличие еще такое, что данные архитектуры по-разному поддерживают разные разрядности. Когда вы посмотрите вот демку Tensor Flow Light, например, может статься так, что на GPU, например, не запускается int8 модели, а запускается только float16-модели, то есть fp16.

(00:45:14)

Бинарные сети, они... Можно сжать классификатор, чтобы он работал как бинарная сеть, но почему мало исследований? Наверное, потому, что нет железных девайсов, которые так прямо работают. Но, возможно, что-то изменится в ближайшем будущем, как минимум, бинарные сети, то есть когда сжимается не до int8, а вообще до 0,1. 

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

Так, Caffe2. А, вот, с Caffe2 последняя история PyTorch Mobile про то, что... Последняя истории Facebook про то, что они отказались от Caffe 2, они включили, условно говоря, весь код, который присутствует в Caffe 2, и они включили его в PyTorch Mobile, то есть теперь это вот так называется. Да, Caffe 2 – это раньше был очень популярный фреймворк для запуска на телефонах, но сейчас вот так.

Кажется, по крайней мере, обещали PyTorch Mobile на GPU.

Ведущий: Тут еще пропущенный вопрос: «Что думаете насчет бинарных сетей?»

Сергей Чичерин: А, нет, я говорил, что они работают, это достаточно интересное направление, но проблема в хардварной реализации, то есть, условно говоря, сейчас даже количество каких-то блоков оптимизируется исключительно под то, чтобы это работало, удобно работало на hardware, потому что какие-то рекомендации, что оно должно быть кратно 8 или какому-то другому числу. 

Да, про сегментацию. Да, Detectron2, но это же фреймворк для... В общем, да, есть какая-то идея о том, что legacy какой-то код, который, подразумевалось, что если PyTorch – это фреймворк для исследований, то Caffe 2 – это inference framework, то есть для того, чтобы запускать сети, неважно, на чем. Но кажется, сейчас происходит то, что непонятно, что под него используется, и все же его не очень используют для inference. 

Мобильный браузер... Я не очень знаю, но очень интересные проекты связаны с TF и JS, то есть когда Tensor Flow работает может быть, в Assembler, в JavaScript, и, соответственно, иногда даже работает в браузере. Может быть, работает не так быстро и не так замечательно, но проект очень интересный. 

Так. «Кажется, что с мобиль...» Мобильные браузеры, в принципе, могут запускать TFJS, я видел какое-то даже приложение, которое работает на TFJS и мобильном браузере, но кажется, что там сильно понижается производительность и все остальное.

Ведущий: На самом деле, этот вебинар у нас по количеству вопросов уже побил предыдущий рекорд.

Сергей Чичерин: Наверное, может быть, потому что я не очень подготовился, и просто показал screen share, так хотя бы как-то пообщались. 

Ведущий: Да, пожалуйста, Эмил, на любые вопросы даем любые ответы.

Сергей Чичерин: TFLight очень хорошо поддерживается на iPhone, и там единственное, что этот ускоритель эпловский, он работает, начиная с iPhone X или XR, с десятых версий.

(00:50:07)

Там как раз появилась поддержка ML Core API. Во-первых, у них есть свой API какой-то, а во-вторых... Я как-то запускал какую-то сеть из PyTorch Mobile в ONNX, и на iPhone она работала real-time, то есть это была какая-то такая real-time призма, по-моему, это какой-то стандартный пример в PyTorch Mobile. 

Так, Java/Kotlin, если Android, то Java Kotlin, еще С. Можно на С++ писать Да. Не могу сказать, ничего не знаю про это, про инференс на FPGA. (00:50:55) Java/Kotlin – это стандартный интерфейс, еще интерфейс для Android-приложений, соответственно, можно и на сишной какой-то писать. Инференс телефона, да, так, System-on-chip – это штука, которая... По сути, это плата в телефоне, которая поддерживает разные устройства, которая поддерживает разные чипы, разные подсистемы, CPU, GPU, DSP, NPU.

Ведущий: Хорошо. Сергей, спасибо большое и за рассказ, и за ответы на вопросы, но к нам продолжают еще идти вопросы.

Сергей Чичерин: Отлично. Мы также можем общаться, во-первых, в Telegram-канале. А, энергопотребление, да, есть, конечно, большая проблема в том, что сейчас эти приложения сильно... Если у нас inference прямо постоянно, то надо рассматривать то, что телефоны могут сильно греться. Эта работа, benchmark.ai, она тоже про device stroking, про понижение производительности, если начинает греться девайс, если нам надо запустить сеть не один раз, а непрерывно.

Да, мы можем продолжить дискуссию в Telegram-канале. 

Ведущий: Хорошо, да, не будем больше задерживать Сергея. Сейчас мы материалы разошлем чуть позже через Telegram-канал и, возможно, и по email, поскольку мы собрали с вас со всех email во время регистрации, и таким образом вы сможете получить ссылки на материалы. Также если, коллеги, кто-то сделал какую-то интересную работу в области нейронных сетей и хочет поделиться с сообществом, обращайтесь к нам там же, мы с удовольствием людей, сделавших интересные работы, позовем у нас о них рассказать. 

На этом спасибо большое за то, что вы были с нами. Спасибо еще раз Сергею. До свидания, и всем доброго вечера.

Сергей Чичерин: Всем доброго вечера. 

(00:53:39) (Конец записи) 


МАТЕРИАЛЫ

СХОЖИЕ ПРОЕКТЫ

Мосэнергосбыт
Российская энергосбытовая компания страны, реализующая свыше 8 % вырабатываемой в России электрической энергии.