Резюме
В этой статье будет представлен пользовательский OP-конвейер Tensorflow Lite с точки зрения инженерии. Эта статья будет разделена на четыре части для конкретного введения: обзор, пользовательская OP на стороне сервера, пользовательская OP на стороне клиента и расширение. Во-первых, в разделе обзора описывается, что такое пользовательский OP. Во-вторых, серверная часть расскажет, как регистрируются, компилируются и шифруются пользовательские OP. Опять же, клиентская часть будет описывать, как пользовательская OP загружается, аутентифицируется, регистрируется и запускается. Наконец, есть раздел расширения, в котором представлено направление, в котором можно улучшить существующий пользовательский OP.
Рис. 1. Особенности пользовательской OP
Среди них пользовательский OP в этой статье имеет следующие четыре характеристики: скорость, возможности, безопасность и инновации.
I) Скорость: следите за последней версией tensorflow Lite и исправьте несколько проблем, таких как ошибка java nio, и решите проблему размещения файлов.
II) Возможности: возможность динамически распространять модели и библиотеки, а также решать сложные проблемы. Такие как распознавание номерного знака, распознавание речи, получение обложек, снятие видеоотпечатков пальцев и другие функции.
III) Безопасность: как пользовательский OP, так и модель зашифрованы, и расшифрованный файл не будет записываться на диск, что обеспечивает безопасность файла.
IV) Инновация: в настоящее время нет официального случая, который можно было бы использовать на пользовательском клиенте OP.В этой статье новаторски используется метод компиляции файлов библиотеки с тремя терминалами на стороне сервера и динамической доставки файлов библиотеки для Android и IOS для загрузки и использования. Конкретные функции будут подробно описаны в последующих главах.
Ключевые слова:
TensorflowLite, пользовательский OP, инновации, инженерная практика
1 Обзор
1.1 Введение в Tensorflow Lite
Эта статья основана на tensorflow Lite, системе обучения искусственного интеллекта, разработанной Google, название которой происходит от ее собственного принципа работы. Tensor (тензор) означает N-мерный массив, Flow (поток) означает вычисление на основе графа потока данных, TensorFlow — это процесс вычисления тензоров, перетекающих с одного конца графа потока на другой конец. TensorFlow — это система, которая передает сложные структуры данных в нейронные сети искусственного интеллекта для анализа и обработки.
На следующем рисунке показана архитектура tensorflow Lite.[1]:
рисунок 1.1 диаграмма архитектуры tensorflow lite
1.2 Введение в ОП
Ввод/вывод OP существует в виде тензора, который может состоять из одного или нескольких тензоров.[3]. Такие операции, как сложение матриц, умножение, объединение, RELU, SOFTMAX и т. д., могут быть реализованы с помощью встроенного OP. Существующие 34 встроенных OP в tensorflow Lite следующие:
Рисунок 1.2 Существующие встроенные типы OP
Рисунок 1.2 показывает встроенный OP Кроме того, tensorflow Lite также поддерживает пользовательский OP, позволяя пользователям добавлять определенные функции. Пользовательские OP будут представлены в главах 2 и 3.
2. Настраиваемая OP на стороне сервера
Как показано на рисунке 2.1, в этой главе будут описаны методы реализации пользовательской OP на стороне сервера, включая регистрацию кода пользовательской OP на стороне сервера, создание пользовательских узлов OP для присоединения и создание модели Lite, а также шифрование OP в последующих разделах.
Рис. 2.1 Блок-схема пользовательской OP на стороне сервера
2.1 Регистрация пользовательской ОП
В этом разделе рассказывается, как зарегистрировать пользовательские коды операций на стороне сервера. Взяв в качестве примера официальный ZeroOut от Google, необходимо ввести заголовочные файлы, связанные с tensorflow. REGISTER_OP Этот макрос определяет имя пользовательской OP, Input — формат ввода (int32), а Output — формат вывода (int32).
Рисунок 2.2 Регистрация пользовательского OP-сервера
После этого в функции вычисления необходимо реализовать соответствующую логику времени выполнения узла OP. Также необходимо заявить об использовании программирования CPU или GPU в конце регистрационного файла. Как показано на рис. 2.3 и рис. 2.4.
Рисунок 2.3 Функция реализации пользовательского OP-сервера
Рис. 2.4 Использование пользовательского определения OP на стороне сервера (GPU или CPU)
2.2 Компиляция пользовательской OP на стороне сервера
На сервере будет реализована компиляция библиотечных файлов трех терминалов (сервер, Android и IOS), Android компилируется с помощью ndk-build, а iOS и сервер компилируются с помощью Makefile.
Предпосылкой пользовательской компиляции OP является настройка среды тензорного потока.[4], который подробно не рассматривается в этой статье. После завершения настройки импортируйте соответствующие заголовочные файлы tensorflow и выполните следующие команды для компиляции OP на стороне сервера.[5].
Рисунок 2.5 Метод компиляции пользовательской OP на стороне сервера
Учитывая, что ndk-build лучше оптимизирован на стороне Android[6], поэтому компиляция на стороне Android компилируется с помощью ndk-build. Конкретный метод показан на рисунке 2.6. Учитывая, что armeabi-v7a представит оптимизацию набора инструкций ARM[2], поэтому эта команда используется первой. Используйте команду --gc-sections -ffunction-sections-fdata-sections, чтобы не добавлять неиспользуемые функции и данные, которые могут уменьшить размер файла библиотеки.
Рис. 2.6 Метод компиляции пользовательского OP на стороне Android
На стороне IOS вы можете использовать Makefile для компиляции, но вам нужно использовать инструмент lipo для преобразования библиотек разных платформ (таких как armv7
, armv7s и arm64 и т. д.) упакованы и интегрированы вместе. См. рис. 2.7 для конкретного использования.
Рис. 2.7 Метод компиляции пользовательского OP на стороне IOS
2.3 Создание пользовательской модели OP
В предыдущем разделе было показано, как сервер регистрирует и компилирует пользовательские OP. В этом разделе описывается, как добавить пользовательские узлы OP в модель Lite.
При генерации zero_out.so вы можете использовать функцию tf.load_op_library, чтобы ввести в модель функцию zero_out, как показано на рис. 2.8:
Рисунок 2.8 Создание пользовательской модели OP
2.4 Пользовательское шифрование OP
Чтобы обеспечить безопасность пользовательской OP, доставленной с сервера, пользовательскую OP необходимо зашифровать. Пользовательский метод шифрования OP в этой статье шифруется с помощью исключающего ИЛИ секретного ключа. Ключ может быть любой длины, но в целях безопасности рекомендуется установить большую длину, например 32-битную или 64-битную. В то же время, учитывая, что если длина шифрования слишком велика, время расшифровки клиента будет слишком большим. Поэтому мы установим максимальную длину шифрования, например, 1 МБ или 512 КБ.
3. Пользовательский OP на стороне клиента
После того, как сервер сгенерирует пользовательскую OP, клиенту необходимо загрузить соответствующую модель и файл библиотеки пользовательской OP, а затем зарегистрировать пользовательскую OP и загрузить модель, чтобы использовать функции, реализованные пользовательской OP на стороне клиента.
Рисунок 3.1. Блок-схема определяемой клиентом OP
3.1 Проверка загрузки модели
Поскольку во время загрузки файлов модели и библиотеки могут быть прерывания, сбои или ошибки версии, клиент вводит проверку MD5 для проверки правильности загрузки модели: если значения MD5 файлов, доставленных клиентом и сервером одинаковы, загрузка считается одинаковой Правильно, выберите загрузку этого файла, чтобы зарегистрировать пользовательский OP с tensorflowLite.
3.2 Регистрация пользовательской OP
Регистрация пользовательской OP расшифровывается тем же секретным ключом, что и сервер. В целях безопасности расшифровка хранится только в памяти (андроид использует метод nio для чтения), то есть файл не помещается на диск. Затем используйте следующую функцию для регистрации:
AddCustom(constchar* name, TfLiteRegistration* registration)
Среди них имя указывает имя входной пользовательской OP, например ZeroOut, GetCover и т. д., регистрация указывает функцию, которую необходимо зарегистрировать с помощью TfLiteRegistration, Конкретные функции следующие:
I) void*(*init) (TfLiteContext* context, const char* buffer, size_t length)
II) void(*free) (TfLiteContext* context, void* buffer)
III) TfLiteStatus(*prepare) (TfLiteContext* context, TfLiteNode* node)
IV) TfLiteStatus(*invoke) (контекст TfLiteContext*, узел TfLiteNode*)
Рис. 3.2 Функция регистрации пользовательской OP
Вышеупомянутые четыре функции, а именно функции init, free, prepare и invoke, обычно реализуют логику функции предварительной обработки подготовки и логику функции выполнения вызова.
В IOS вы можете напрямую вызвать функцию AddCustom. Этот интерфейс не предоставляется на стороне Android. Эта функция должна быть представлена на уровне JNI, как показано на рисунке 3.3:
Рисунок 3.3 AddCustom динамически загружает функцию OP
Кроме того, эта функция также использует dlopen для динамической загрузки. Например, когда сервер динамически отправляет OP с именем ZeroOut, ему нужно знать только путь к ZeroOut.so, а затем можно вызвать методы Prepare и Invoke для динамической регистрации OP без установки нового APK.
Когда регистрация пользовательской OP завершена, вы можете загрузить и запустить пользовательскую функцию OP через загрузку модели tensorflowLite.[7].
4. Расширение
Инженерная практика этой статьи включает в себя компиляцию пользовательской платформы OP на сервере и использование функций пользовательской OP на клиенте. Пользовательский OP может быть хорошим дополнением к недостаткам реализации одной функции в tensorflowLite. Однако пользовательский ОП в этой статье также имеет много недостатков, которые можно оптимизировать следующим образом:
1) Соответствующие файлы библиотек и файлы моделей не сжаты, и файлы, которые должны быть доставлены, могут быть больше. Следовательно, могут быть введены алгоритмы сжатия моделей.
2) Существующие форматы имеют только несколько одиночных форматов, таких как int32 и float32.Для повышения удобства использования можно ввести такие форматы данных, как string и double64.
использованная литература:
[1] https://www.tensorflow.org/mobile/tflite
[2] https://baike.baidu.com/item/набор инструкций ARM/907786?fr=aladdin
[3] https://www.tensorflow.org/api_docs/python/tf/Session
[4] https://www.tensorflow.org/versions/r1.5/install/install_sources
[5] https://www.tensorflow.org/extend/adding_an_op
[6] https://developer.android.google.cn/ndk/guides/ndk-build
[7] https://www.tensorflow.org/versions/r1.5/mobile/tflite/demo_android
В будущем мы запустим серию проектов инженерной практики на основе tensorflow. Клиент запустит все виды идентификации ребенка, идентификации домашних животных и так далее. Сервер будет запускать проекты автоматизации пользовательского интерфейса для автоматической идентификации различных бизнес-компонентов, различных компонентов пользовательского интерфейса и т. д. Добро пожаловать, чтобы продолжать обращать внимание ~
Отсканируйте код, чтобы подписаться на общедоступную учетную запись [Xianyu Technology].