Я пытаюсь использовать квантованную модель с 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, вероятно, в небольших моделях, и, вероятно, не столкнется с этой проблемой.
Этот лимит может быть лучше задокументирован и / или выполнять проверку во время выполнения?