Обнаружен поврежденный стек внутри вызова интерпретатора Tensorflow Lite Micro-> Invoke () с моделью Mobilenet_V1_0.25_224_quant - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь использовать квантованную модель с Tensorflow Lite Micro, и получил ошибку сегментации в вызове интерпретатора-> Invoke ().

Отладчик показал, что произошла ошибка сегментации при возврате из Eval () в conv. cc на узле 28 CONV_2D, и стек поврежден. Сообщение об ошибке *** stack smashing detected ***: <unknown> terminated с флагами компилятора "-fstack-protector-all -Wstack-protector".

Мой тест был просто из примера обнаружения человека с заменой модели на Mobilenet_V1_0.25_224_quant на сайте предварительно обученных моделей Tensorflow lite с достаточно увеличенным kTensorArenaSize и размером ввода / вывода модели, измененным на 224x224x3 и 1x1001, amd вытащил дополнительных необходимых операторов.

Также пробовал несколько различных моделей, в другом количественном режиме Mobilenet_V1_0.25_192_quant показывает ту же проблему с ошибкой, но обычные режимы с плавающей запятой Mobilenet_V1_0.25_192 и Mobilenet_V1_0.25_224 работают нормально со многими циклами.

Кто-нибудь видел подобную проблему? Или есть какие-то ограничения на Tensorflow Lite Micro, о которых я должен знать?

Эта проблема может быть воспроизведена на этом коммите разветвленного тензорного репозитория.

Команда сборки:

$ bazel build //tensorflow/lite/micro/examples/person_detection:person_detection       -c dbg --copt=-fstack-protector-all --copt=-Wstack-protector --copt=-fno-omit-frame-pointer

И запустить:

$ ./bazel-bin/tensorflow/lite/micro/examples/person_detection/person_detection

Файлы изменены:

tensorflow/lite/micro/examples/person_detection/main_functions.cc
tensorflow/lite/micro/examples/person_detection/model_settings.h 
tensorflow/lite/micro/examples/person_detection/person_detect_model_data.cc

Изменения main_functions. cc:

constexpr int kTensorArenaSize = 1400 * 1024;
static tflite::MicroOpResolver<5> micro_op_resolver;
micro_op_resolver.AddBuiltin(tflite::BuiltinOperator_RESHAPE,
                             tflite::ops::micro::Register_RESHAPE());
micro_op_resolver.AddBuiltin(tflite::BuiltinOperator_SOFTMAX,
                             tflite::ops::micro::Register_SOFTMAX(), 1, 2);

Изменения в model_settings.h

constexpr int kNumCols = 224;
constexpr int kNumRows = 224;
constexpr int kNumChannels = 3;
constexpr int kCategoryCount = 1001;

Последний файл данных модели person_detect_model_data. cc довольно большой, см. Полный файл на github.

28 марта 2020 года: также протестировано на Raspberry Pi 3, результаты такие же, как на x86 Ubuntu 18.04.

pi@raspberrypi:~/tests $ ./person_detection 
*** stack smashing detected ***: <unknown> terminated
Aborted

Спасибо за помощь.

Проблема root причина найдена - Обновлено 2 апреля 2020 года:

Я обнаружил, что проблема вызвана переполнением массива данных операции слоя. Tensorflow microlite имеет скрытое ограничение (или я пропустил документ, по крайней мере, время выполнения TF microlite не проверяет) на выходных каналах до максимального значения 256 в структуре OpData conv. cc для TF Micro Lite.

constexpr int kMaxChannels = 256;
....
struct OpData {
...
  // Per channel output multiplier and shift.
  // TODO(b/141139247): Allocate these dynamically when possible.
  int32_t per_channel_output_multiplier[kMaxChannels];
  int32_t per_channel_output_shift[kMaxChannels];
...
}

Модель mobil enet Mobilenet_V1_0.25_224_quant.tflite с 1000 выходными классами и 1001 внутренним каналом. И это вызвало повреждение стека в tflite :: PopulateConvolutionQuanizationParams () тензорного потока / lite / kernels / kernel_util. cc: 90 для последнего Conv2D с выходным размером 1001.

Нет проблем для TF и ​​TF lite поскольку они, как полагают, не используют это определение структуры.

Подтверждено увеличением каналов до 1024 на циклах вызовов оценки модели.

Хотя большинство случаев микролита TF, вероятно, в небольших моделях, и, вероятно, не столкнется с этой проблемой.

Этот лимит может быть лучше задокументирован и / или выполнять проверку во время выполнения?

...