Машинное обучение на мобильных телефонах
Содержание
Задачи машинного обучения на телефонах
Кастомизация
Конечно же, самое первое, что может прийти в голову про применения машинного обучения на телефонах — это кастомизация. Подбор музыки, новостей, любого контента — все это достигается с помощью машинного обучения. Приложение получает ваши персональные данные и, используя данные старых пользователей, показывает вам то, что понравилось людям с наиболее подходящими данными. Однако такая работа связана с очень большими вычислениями, и, чаще всего, выполняется на сторонних серверах. Самая частая модель для классификации изображений — CNN, однако порой даже такая классификация является излишней.
Распознавание фото, текста и видео
Распознавание фото и видео на мобильных телефонах мало чем отличается от обычных компьютерных методов, только цели немного другие. Например, некоторые мобильные телефоны распознают владельца через Face ID с помощью фронтальную камеру. Есть приложения для определения возраста, пола.
Если же рассмотреть распознавание текста, то и у него тоже есть большое количество применений — сканирование чеков, кредитные карты, документы, переводить в реальном времени иностранные слова.
Существует несколько известных библиотек для работы с изображениями в мобильных приложениях: Tesseract, OpenCV, Mobile Vision Google, ML Kit. Изображения легко передавать через сеть, так что можно обрабатывать их и на веб-серверах.
Распознавание звука
Распознавание звука и его парсинг тоже очень важная задача машинного обучения. Голосовые помощники, голосовой ввод, умные дома — все это нужно для нашей жизни.
Для распознавания речи есть библиотека pocketsphinx
Анализ данных с сенсоров
Приложение | Датчик |
---|---|
Распознавание человеческой активности | Акселерометр |
Гироскоп | |
Магнитометр | |
Монитор сердечного ритма | |
Распознавание жестов | Акселерометр |
Гироскоп | |
Распознавание падений | Акселерометр |
Гироскоп | |
Датчики близости | |
Распознавание аварий | Акселерометр |
Приемник GPS | |
Распознавание условий окружающей среды | Датчик окружающего света |
Датчик влажности | |
Термометр | |
Датчик давления | |
Приемник GPS | |
Распознавание стресса | Микрофон |
Электрокардиограф | |
Монитор сердечного ритма | |
Датчик проводимости кожи | |
Распознавание эмоций | Микрофон |
Камера | |
Электрокардиограф | |
Монитор сердечного ритма | |
Датчик проводимости кожи |
Достаточно важная область жизни человека и его связи с телефоном — датчики и сенсоры. В мире их существует огромное количество, и, к сожалению, большинство из них работает недостаточно точно. Но это исправляет машинное обучение, уточняя данные с сенсоров. Это важно для людей с опасными для жизни болезнями, например, может произойти сердечный приступ, и процессор лучше любого человека скажет, что это он, и, считав местоположение с навигатора, вызовет скорую помощь в тот же момент.
Навигация
Навигационные приложения можно значительно улучшить, если интегрировать в них алгоритмы по распознаванию фото и видео. К примеру, если приложение подключается к камере в автомобиле, оно может анализировать ситуацию на дороге и предупреждать водителя в случае возможной опасности. Так можно распознавать пробки, дорожные знаки по ограничению скорости, агрессивное поведение окружающих водителей и другие характеристики дорожного движения.
Запуск машинного обучения на мобильных телефонах
Для запуска моделей в области глубокого обучения необходимо наличием мощных вычислительных ресурсов и большого объема учебных данных. Поэтому построение модели может осуществляться с помощью высокопроизводительных CPU и GPU, а после построения ее можно запустить на мобильном устройстве с гораздо меньшей вычислительной мощностью на CPU, ASIC, FPGA или мобильных GPU.
CPU
Хотя процессоры могут быть громоздкими для построения современных моделей глубокого обучения, когда учебные данные очень большие, они являются приемлемым вариантом для обучения или адаптации моделей к небольшим объемам данных, а также для развертывания предварительно построенных моделей глубокого обучения. Очевидным преимуществом развертывания глубокого обучения на CPU является то, что процессоры доступны для большинства планшетов и мобильных телефонов. Кроме того, эти устройства часто поставляются с мощными процессорами и имеют широкий выбор встроенных датчиков. Это означает отсутствие дополнительных затрат на аппаратное обеспечение и таким образом обеспечение большего количества приложений ИИ для потенциально огромного рынка. Приложения в реальном времени могут быть реализованы на стандартном процессоре с минимальными затратами или без дополнительных усилий. Кроме того CPU в соверменных мобильных устройвах столь же мощны как и в компьютерах, что позволяет достачно эффективно их использовать для данных целей.
GPU
GPU — графический процессор, который по своему устройству является процессором с несколькими тысячами маленьких ядер. За счет этого достигается большая степень параллельности, что позволяет производить на GPU более эффективные вычисления с матрицами и тензорами, нежели на CPU. На данный момент существует множество мобильных GPU от разных производителей, например одной из самых заметных систем смартфонов на чипе (SoC) является чип Qualcomm Snapdragon.
FPGA
В то время как CPU создан для вычислений общего назначения, а ASIC сделана исключительно для специфических вычислений, FPGA находится между ними. FPGA могут быть (повторно) запрограммированы ("перепрошиты") для выполнения многих специфических задач очень эффективно. Также FPGA позволяет достичь баланса между разработкой системы и потреблением энергии. На базовом уровне FPGA используют схемы flip-flop для реализации последовательных логических функций и поиска таблиц. Логические функции реализуются посредством программируемой памяти, которая также контролирует соединения коммутационных цепей, таким образом, FPGA не нужно явно выполнять логическую операцию после того, как она запрограммирована. Современные FPGA, как правило, используют SoC подход для интеграции ядра процесса, коммуникационного ядра, и память на одной микросхеме. FPGA вендоры, такие как Xilinx и Altera, создали множество программного обеспечения для облегчения программирования на FPGA. В то время как традиционное программирование для FPGA требует знаний о цифровых схемах и языка описания оборудования (HDL), сейчас оно движется в сторону создания схем высокого уровня(HLS). Существует пять основных категорий инструментов HLS, но для мобильного глубокого обучения наиболее актуален фреймворк параллельных вычислений OpenCL. OpenCL — это язык основанный на C и являющийся открытой, стандартизированной основой для ускорения алгоритмов. Программы, написанные на OpenCL, могут быть выполнены на GPU, DSP и FPGA. OpenCL можно рассматривать как open source версию CUDA.
ASIC и TPU
ASIC (Application-Specific Integrated Circuit) - интегральная схема конкретно под поставленную задачу. Примером можем служить интегральная схема реализующая необходимую нейросеть. За счёт этого, энергопотребление становится меньше, а скорость работы операций выше по сравнению с CPU, GPU и FPGA.Также, большинство вычислительных узлов может работать параллельно, только зависимости по данным и неравномерность вычислений на разных уровнях сети могут помешать постоянно задействовать работающими все ALU. Самым большим недостатком является потеря настраиваемости сети, так как настрока параметров будет связана с изменением интегральной схемы. На текущее время, существует множество ASIC, разработанных для нейронных сетей, например TPU разработанная специально для нейросетевого машинного обучения Google.
Сравнение
Как упоминалось в предыдущих подразделах, CPU и GPU являются вычислительными платформами общего назначения, предлагая таким образом большую гибкость. Начальное алгоритмическое обучение модели должно использовать CPU и GPU для получения предварительного представления о достижимой производительности. CPU и GPU поддерживают вычисления с полной точностью и могут быть использованы для моделей с интенсивными вычислениями, что часто означает более высокую точность прогнозирования. Однако, GPU и CPU более энергозатратны. ASIC могут быть гораздо более энергоэффективными, так как аппаратное обеспечение изготовлено специально для некоторых вычислений. Тем не менее, проектирование и разработка микросхем ASIC может занять очень много времени. Таким образом, ASIC используется только тогда, когда модель фиксирована и требуются низкие затраты энергии. FPGA предлагает компромисс между энергопотреблением, точностью прогнозирования и скоростью разработки системы.
Процессоры
Из-за медлительности телефонов развитие машинного обучения на телефонах началось совсем недавно. Раньше все данные хранились на серверах компаний, выбор модели был очень широк, и, с точки зрения безопасности, это было плохо. Однако теперь IT-гиганты, такие, как Google, переходят на модель федеративного обучения. Понятно, что обычный телефон не может себе позволить обучаться на тяжелых моделях, таких как, например, нейронные сети. Однако существуют модели, которые потребляют очень малое количество памяти и времени на обучение. В основном именно они используются, когда нет соединения с сервером.
Однако машинное обучение стало настолько актуальным, что производители процессоров задумались о том, что бы создавать процессоры, некоторые чипы которых заточены под задачи машинного обучения.
Существует огромное число процессоров для огромного числа задач, начиная от задачи линейной регрессии до задач глубокого обучения.
Ниже представлены примеры таких процессоров
Qualcomm Neural Processing SDK
Этот процессор заточен под работу с аудио и видео: распознавание речи, умная камера, очистка картинки от шума и подобное.
Разработчики данного процессора делают упор на CNN сети, однако там встречаются почти все известные модели машинного обучения. Обеспечивает аппаратное ускорение ML-моделей на связке DSP + GPU + CPU для Snapdragon чипов.
void executeNetwork(std::unique_ptr<zdl::SNPE::SNPE>& snpe, std::unique_ptr<zdl::DlSystem::ITensor>& input, std::string OutputDir, int num) { static zdl::DlSystem::TensorMap outputTensorMap; snpe->execute(input.get(), outputTensorMap); zdl::DlSystem::StringList tensorNames = outputTensorMap.getTensorNames(); //Iterate through the output Tensor map, and print each output layer name std::for_each( tensorNames.begin(), tensorNames.end(), [&](const char* name) { std::ostringstream path; path << OutputDir << "/" << "Result_" << num << "/" << name << ".raw"; auto tensorPtr = outputTensorMap.getTensor(name); SaveITensor(path.str(), tensorPtr); }); } // The following is a partial snippet of the function void SaveITensor(const std::string& path, const zdl::DlSystem::ITensor* tensor) { ... std::ofstream os(path, std::ofstream::binary); if (!os) { std::cerr << "Failed to open output file for writing: " << path << "\n"; std::exit(EXIT_FAILURE); } for ( auto it = tensor->cbegin(); it != tensor->cend(); ++it ) { float f = *it; if (!os.write(reinterpret_cast<char*>(&f), sizeof(float))) { std::cerr << "Failed to write data to: " << path << "\n"; std::exit(EXIT_FAILURE); } } }
Короткий пример использования ITensors
Huawei Ai
Этот процессор заточен под компьютерное зрение, распознавание речи и интерпретацию естественного языка
Как можно заметить по картинке, здесь нет никакого обучения, мы берем уже обученную модель и пользуемся ею. Огромное количество классов, предназначенных для различных задач. HiAI SDK дает доступ к заточенному под операции над матрицами NPU. Таким образом, оптимизируются нейронные сети на матрицах.
Пример кода, распознающего, одинаковые ли люди изображены на картинке.
if (!AiEngineMgr.isAsync) { resultCode = mFaceComparator.faceCompare(image1, image2, mFaceCompareResult, null); } else { mFaceComparator.faceCompare(image1, image2, null, new VisionCallback<FaceCompareResult>() { @Override public void onResult(FaceCompareResult faceCompareResult){ mFaceCompareResult = faceCompareResult; resultCode = 0; } @Override public void onError(int i){ resultCode = i; HopeCVLog.d(temp_Log,"onError: "+i); } @Override public void onProcessing(float v){ } }); } try { Float confidence = mFaceCompareResult.isSamePerson(); boolean samePerson = mFaceCompareResult.getSocre(); } catch (Exception e) { e.printStackTrace(); }
NeuroPilot SDK
Процессор заточен под отслеживание поз множества людей, идентификацию множества объектов, семантическую сегментацию, обработку изображений. NeuroPilot SDK позволяет решать ML-задачи с помощью APU + GPU. APU заточен под модели глубоких нейронных сетей. Обеспечивает аппаратное ускорение для свертки, полностью связанных нейронных сетей (то есть нейронных сетей без дропаута), функции активации.
У данной разработки есть три пути развития:
- чип NeuroPilot Micro, представляющий собой микрокомпьютер, оптимизированный под задачи машинного обучения. Его возможности ограничены $10^6$ операциями, мегабайтами памяти. В качестве такого чипа так же можно использовать обычные схематические конструкторы, такие как Arduino (конечно же, их скорость будет ниже на порядок).
- телефон или телефонный чип, на который загружено специальное ПО. Возможности ограничены примерно $10^8 - 10^9$ операциями и гигабайтами памяти.
- удаленное серверное управление. По словам авторов, количество операций и памяти почти безграничны.
В своем основании использует TFLite модели, лучше всего подходит TensorFlow и Keras. Можно писать программы прямо на нем, они будут успешно оптимизироваться.
CoreML SDK
Создан для классификации объектов, звуков, движений, текста, табличных данных, обладает рекомендательной системой. Работает на NPU. Пример использования для картинок.
Данное программное обеспечение сильно разделено. У нас есть специальная MLModel, которая изначально принимает изображения, и сохраняет их в компактном виде, сохраняя там же уже натренированную сеть. Затем данный пакет передается уже программе на Swift, и она обрабатывает его. Пример кода:
DispatchQueue.main.async { guard let results = request.results else { self.classificationLabel.text = "Unable to classify image.\n\(error!.localizedDescription)" return } let classifications = results as! [VNClassificationObservation] if classifications.isEmpty { self.classificationLabel.text = "Nothing recognized." } else { // Display top classifications ranked by confidence in the UI. let topClassifications = classifications.prefix(2) let descriptions = topClassifications.map { classification in // Formats the classification for display; e.g. "(0.37) cliff, drop, drop-off". return String(format: " (%.2f) %@", classification.confidence, classification.identifier) } self.classificationLabel.text = "Classification:\n" + descriptions.joined(separator: "\n") } }
Источники информации
- azoft.ru - о применении машинного обучения.
- habr.com - железо и процессоры.
- researchgate.net - Deep Learning on Mobile Devices, Yunbin Deng
- habr.com - аппаратное ускорение нейронных сетей
- habr.com - краткий обзор и пример на CoreML.
- habr.com - распознавание изображений.
- habr.com - использование ML Kit.
- habr.com - использование Pocketsphinx.
- osp.ru - глубинный анализ данных с сенсоров.