Skip to content

Commit 368fe32

Browse files
committed
Enabled support for ESP-NN optimizations
1. Declutter: Create separate .cmake for `esp` specfic boards 2. Add ESP-NN sources 3. Updated tflm_esp_kernels to fix multiple definitions bug Signed-off-by: Vikram <[email protected]>
1 parent 1331698 commit 368fe32

File tree

3 files changed

+190
-67
lines changed

3 files changed

+190
-67
lines changed

micropython-modules/microlite/micropython.cmake

Lines changed: 122 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -28,109 +28,93 @@ if (PICO_SDK_PATH)
2828
set(MICROLITE_PLATFORM "RP2")
2929
endif()
3030

31-
if(IDF_TARGET STREQUAL "esp32")
32-
set(MICROLITE_PLATFORM "ESP32")
33-
endif()
34-
35-
if(IDF_TARGET STREQUAL "esp32s2")
36-
set(MICROLITE_PLATFORM "ESP32S2")
37-
endif()
38-
39-
if(IDF_TARGET STREQUAL "esp32s3")
40-
set(MICROLITE_PLATFORM "ESP32S3")
41-
endif()
42-
43-
if(IDF_TARGET STREQUAL "esp32c3")
44-
set(MICROLITE_PLATFORM "ESP32C3")
45-
endif()
31+
include (${CMAKE_CURRENT_LIST_DIR}/micropython_esp.cmake)
4632

4733
get_filename_component(TENSORFLOW_DIR ${PROJECT_DIR}/../../../tensorflow ABSOLUTE)
4834

4935
add_library(microlite INTERFACE)
5036

51-
if (MICROLITE_PLATFORM STREQUAL "ESP32" OR
52-
MICROLITE_PLATFORM STREQUAL "ESP32S3" OR
53-
MICROLITE_PLATFORM STREQUAL "ESP32C3" OR
54-
MICROLITE_PLATFORM STREQUAL "ESP32S2")
55-
56-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
57-
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++")
58-
59-
endif()
60-
6137
# needed when we have custom/specialized kernels.
6238
# add_custom_command(
6339
# OUTPUT ${TF_MICROLITE_SPECIALIZED_SRCS}
6440
# COMMAND cd ${TENSORFLOW_DIR} && ${Python3_EXECUTABLE} ${MICROPY_DIR}/py/makeversionhdr.py ${MICROPY_MPVERSION}
6541
# DEPENDS MICROPY_FORCE_BUILD
6642
# )
6743

68-
if (MICROLITE_PLATFORM STREQUAL "ESP32" OR
69-
MICROLITE_PLATFORM STREQUAL "ESP32S3" OR
70-
MICROLITE_PLATFORM STREQUAL "ESP32C3" OR
71-
MICROLITE_PLATFORM STREQUAL "ESP32S2")
72-
set (TF_MICROLITE_LOG
73-
${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/debug_log.cpp
74-
${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/micro_time.cpp
75-
)
76-
endif()
77-
7844
if (MICROLITE_PLATFORM STREQUAL "RP2")
79-
set (TF_MICROLITE_LOG
45+
set (TF_MICROLITE_LOG
8046
${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/cortex_m_generic/debug_log.cpp
8147
${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/cortex_m_generic/micro_time.cpp
8248
)
8349
endif()
8450

51+
if (CONFIG_IDF_TARGET)
52+
set(TF_ESP_DIR "${CMAKE_CURRENT_LIST_DIR}/../../tflm_esp_kernels/components/tflite-lib")
53+
set(TF_LITE_DIR "${TF_ESP_DIR}/tensorflow/lite")
54+
set(TF_MICRO_DIR "${TF_LITE_DIR}/micro")
55+
set(TF_MICROLITE_LOG
56+
${TF_MICRO_DIR}/debug_log.cc
57+
${TF_MICRO_DIR}/micro_time.cc
58+
)
59+
else()
60+
set(TF_LITE_DIR "${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite")
61+
set(TF_MICRO_DIR "${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro")
62+
endif()
8563

86-
87-
88-
# copied from https://github.com/espressif/tflite-micro-esp-examples/blob/master/components/tflite-lib/CMakeLists.txt
89-
# commit: 2ef35273160643b172ce76078c0c95c71d528842
90-
set(TF_LITE_DIR "${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite")
91-
set(TF_MICRO_DIR "${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro")
92-
93-
# lite c
64+
# lite c
9465

9566
file(GLOB TF_LITE_C_SRCS
9667
"${TF_LITE_DIR}/c/*.cpp"
9768
"${TF_LITE_DIR}/c/*.c")
9869

99-
# lite core/api
100-
70+
# lite core/api
71+
if (CONFIG_IDF_TARGET)
72+
file(GLOB TF_LITE_API_SRCS
73+
"${TF_LITE_DIR}/core/api/*.cc"
74+
"${TF_LITE_DIR}/core/api/*.c"
75+
"${TF_LITE_DIR}/core/c/*.cc"
76+
"${TF_LITE_DIR}/core/c/*.c")
77+
else()
10178
file(GLOB TF_LITE_API_SRCS
10279
"${TF_LITE_DIR}/core/api/*.cpp"
10380
"${TF_LITE_DIR}/core/api/*.c")
81+
endif()
10482

105-
# lite experimental
83+
# lite experimental
10684

10785
file(GLOB TF_LITE_MICROFRONTEND_SRCS
10886
"${TF_LITE_DIR}/experimental/microfrontend/lib/*.c"
87+
"${TF_LITE_DIR}/experimental/microfrontend/lib/*.cc"
10988
"${TF_LITE_DIR}/experimental/microfrontend/lib/*.cpp")
11089

111-
# lite kernels
90+
# lite kernels
11291

11392
file(GLOB TF_LITE_KERNELS_SRCS
11493
"${TF_LITE_DIR}/kernels/*.c"
11594
"${TF_LITE_DIR}/kernels/*.cpp"
95+
"${TF_LITE_DIR}/kernels/*.cc"
11696
"${TF_LITE_DIR}/kernels/internal/*.c"
11797
"${TF_LITE_DIR}/kernels/internal/*.cpp"
98+
"${TF_LITE_DIR}/kernels/internal/*.cc"
11899
"${TF_LITE_DIR}/kernels/internal/reference/*.c"
119100
"${TF_LITE_DIR}/kernels/internal/reference/*.cpp"
101+
"${TF_LITE_DIR}/kernels/internal/reference/*.cc"
120102
)
121103

122-
# lite schema
104+
# lite schema
123105
file(GLOB TF_LITE_SCHEMA_SRCS
124106
"${TF_LITE_DIR}/schema/*.c"
107+
"${TF_LITE_DIR}/schema/*.cc"
125108
"${TF_LITE_DIR}/schema/*.cpp")
126109

127-
# micro
110+
# micro
128111

129112
file(GLOB TF_MICRO_SRCS
130113
"${TF_MICRO_DIR}/*.c"
114+
"${TF_MICRO_DIR}/*.cc"
131115
"${TF_MICRO_DIR}/*.cpp")
132116

133-
117+
134118
# logs are platform specific and added seperately
135119

136120
list(REMOVE_ITEM TF_MICRO_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/debug_log.cpp)
@@ -139,24 +123,28 @@ list(REMOVE_ITEM TF_MICRO_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/mi
139123
# arena allocator
140124
file(GLOB TF_MICRO_ARENA_ALLOCATOR_SRCS
141125
"${TF_MICRO_DIR}/arena_allocator/*.cpp"
126+
"${TF_MICRO_DIR}/arena_allocator/*.cc"
142127
"${TF_MICRO_DIR}/arena_allocator/*.c")
143128

144-
# micro kernels
129+
# micro kernels
145130

146131
file(GLOB TF_MICRO_KERNELS_SRCS
147132
"${TF_MICRO_DIR}/kernels/*.c"
133+
"${TF_MICRO_DIR}/kernels/*.cc"
148134
"${TF_MICRO_DIR}/kernels/*.cpp")
149135

150-
# micro memory_planner
136+
# micro memory_planner
151137

152138
file(GLOB TF_MICRO_MEMORY_PLANNER_SRCS
153139
"${TF_MICRO_DIR}/memory_planner/*.cpp"
140+
"${TF_MICRO_DIR}/memory_planner/*.cc"
154141
"${TF_MICRO_DIR}/memory_planner/*.c")
155142

156143
# tflite_bridge
157144

158145
file(GLOB TF_MICRO_TFLITE_BRIDGE_SRCS
159146
"${TF_MICRO_DIR}/tflite_bridge/*.cpp"
147+
"${TF_MICRO_DIR}/tflite_bridge/*.cc"
160148
"${TF_MICRO_DIR}/tflite_bridge/*.c")
161149

162150
set (BOARD_ADDITIONAL_SRCS "")
@@ -171,7 +159,7 @@ if (MICROLITE_PLATFORM STREQUAL "RP2")
171159
list(REMOVE_ITEM TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/pooling.cpp)
172160
list(REMOVE_ITEM TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/softmax.cpp)
173161
list(REMOVE_ITEM TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/svdf.cpp)
174-
162+
175163
list(APPEND TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/cmsis_nn/add.cpp)
176164
list(APPEND TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/cmsis_nn/conv.cpp)
177165
list(APPEND TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/cmsis_nn/depthwise_conv.cpp)
@@ -180,7 +168,7 @@ if (MICROLITE_PLATFORM STREQUAL "RP2")
180168
list(APPEND TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/cmsis_nn/pooling.cpp)
181169
list(APPEND TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/cmsis_nn/softmax.cpp)
182170
list(APPEND TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/cmsis_nn/svdf.cpp)
183-
171+
184172
set (CMSIS_NN_SRCS
185173

186174
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/cmsis_nn/Source/ActivationFunctions/arm_relu6_s8.c
@@ -243,7 +231,7 @@ if (MICROLITE_PLATFORM STREQUAL "RP2")
243231
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/cmsis_nn/Source/SoftmaxFunctions/arm_softmax_s8.c
244232
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/cmsis_nn/Source/SoftmaxFunctions/arm_softmax_s8_s16.c
245233
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/cmsis_nn/Source/SoftmaxFunctions/arm_softmax_u8.c
246-
234+
247235
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/cmsis_nn/Source/SVDFunctions
248236
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/cmsis_nn/Source/SVDFunctions/arm_svdf_s8.c
249237
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/cmsis_nn/Source/SVDFunctions/arm_svdf_state_s16_s8.c
@@ -279,13 +267,47 @@ target_sources(microlite INTERFACE
279267

280268
else()
281269

270+
if (CONFIG_IDF_TARGET)
271+
set(tfmicro_kernels_dir ${TF_MICRO_DIR}/kernels)
272+
# set(tfmicro_nn_kernels_dir
273+
# ${tfmicro_kernels_dir}/)
274+
275+
# remove sources which will be provided by esp_nn
276+
list(REMOVE_ITEM TF_MICRO_KERNELS_SRCS
277+
"${tfmicro_kernels_dir}/add.cc"
278+
"${tfmicro_kernels_dir}/conv.cc"
279+
"${tfmicro_kernels_dir}/depthwise_conv.cc"
280+
"${tfmicro_kernels_dir}/fully_connected.cc"
281+
"${tfmicro_kernels_dir}/mul.cc"
282+
"${tfmicro_kernels_dir}/pooling.cc"
283+
"${tfmicro_kernels_dir}/softmax.cc"
284+
)
285+
286+
# tflm wrappers for ESP_NN
287+
FILE(GLOB ESP_NN_WRAPPERS
288+
"${tfmicro_kernels_dir}/esp_nn/*.cc")
289+
endif()
282290

283-
target_sources(microlite INTERFACE
284291
# microlite micropython module sources
292+
set (MICROLITE_PYTHON_SRCS
285293
${CMAKE_CURRENT_LIST_DIR}/tensorflow-microlite.c
286294
${CMAKE_CURRENT_LIST_DIR}/audio_frontend.c
287-
${CMAKE_CURRENT_LIST_DIR}/openmv-libtf.cpp
288295
${CMAKE_CURRENT_LIST_DIR}/micropython-error-reporter.cpp
296+
)
297+
298+
if (CONFIG_IDF_TARGET)
299+
list(APPEND MICROLITE_PYTHON_SRCS
300+
${CMAKE_CURRENT_LIST_DIR}/openmv-libtf-updated.cpp
301+
)
302+
else()
303+
list(APPEND MICROLITE_PYTHON_SRCS
304+
${CMAKE_CURRENT_LIST_DIR}/openmv-libtf.cpp
305+
)
306+
endif()
307+
308+
target_sources(microlite INTERFACE
309+
# micro_python sources for tflite
310+
${MICROLITE_PYTHON_SRCS}
289311

290312
# tf lite sources
291313
${TF_LITE_C_SRCS}
@@ -302,8 +324,27 @@ target_sources(microlite INTERFACE
302324
${TF_MICRO_TFLITE_BRIDGE_SRCS}
303325

304326
${TF_MICROLITE_LOG}
327+
${ESP_NN_SRCS} # include esp-nn sources for Espressif chipsets
328+
${ESP_NN_WRAPPERS} # add tflm wrappers for ESP_NN
329+
)
305330

306-
)
331+
if (CONFIG_IDF_TARGET)
332+
set(signal_srcs
333+
${TF_ESP_DIR}/signal/micro/kernels/rfft.cc
334+
${TF_ESP_DIR}/signal/micro/kernels/window.cc
335+
${TF_ESP_DIR}/signal/src/kiss_fft_wrappers/kiss_fft_float.cc
336+
${TF_ESP_DIR}/signal/src/kiss_fft_wrappers/kiss_fft_int16.cc
337+
${TF_ESP_DIR}/signal/src/kiss_fft_wrappers/kiss_fft_int32.cc
338+
${TF_ESP_DIR}/signal/src/rfft_float.cc
339+
${TF_ESP_DIR}/signal/src/rfft_int16.cc
340+
${TF_ESP_DIR}/signal/src/rfft_int32.cc
341+
${TF_ESP_DIR}/signal/src/window.cc
342+
)
343+
target_sources(microlite INTERFACE
344+
${CMAKE_CURRENT_LIST_DIR}/python_ops_resolver.cc
345+
${signal_srcs}
346+
)
347+
endif()
307348

308349
endif()
309350

@@ -350,11 +391,22 @@ target_compile_options(microlite INTERFACE
350391
-Wno-error=maybe-uninitialized
351392
)
352393

353-
354-
394+
else()
395+
if (CONFIG_IDF_TARGET)
396+
target_include_directories(microlite INTERFACE
397+
${TF_ESP_DIR}
398+
${TF_ESP_DIR}/third_party/kissfft
399+
${TF_ESP_DIR}/third_party/kissfft/tools
400+
${TF_ESP_DIR}/third_party/flatbuffers/include
401+
${TF_ESP_DIR}/third_party/gemmlowp
402+
${TF_ESP_DIR}/third_party/ruy
403+
${TF_ESP_DIR}/signal/micro/kernels
404+
${TF_ESP_DIR}/signal/src
405+
${TF_ESP_DIR}/signal/src/kiss_fft_wrappers
406+
${ESP_NN_INC}
407+
)
355408
else()
356409

357-
# ESP32
358410
target_include_directories(microlite INTERFACE
359411
${CMAKE_CURRENT_LIST_DIR}
360412
${CMAKE_CURRENT_LIST_DIR}/tflm
@@ -364,13 +416,20 @@ target_include_directories(microlite INTERFACE
364416
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/gemmlowp
365417
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/ruy
366418
)
419+
endif()
367420

368421
target_compile_definitions(microlite INTERFACE
369422
MODULE_MICROLITE_ENABLED=1
370423
TF_LITE_STATIC_MEMORY=1
371424
TF_LITE_MCU_DEBUG_LOG
372425
NDEBUG
373-
)
426+
)
427+
if (CONFIG_IDF_TARGET)
428+
target_compile_definitions(microlite INTERFACE
429+
ESP_NN=1 # enables esp_nn optimizations if those sources are added
430+
CONFIG_NN_OPTIMIZED=1 # use Optimized vs ansi code from ESP-NN
431+
)
432+
endif()
374433

375434
target_compile_options(microlite INTERFACE
376435
-Wno-error
@@ -388,7 +447,4 @@ target_compile_options(microlite INTERFACE
388447

389448
endif()
390449

391-
392-
393450
target_link_libraries(usermod INTERFACE microlite)
394-

0 commit comments

Comments
 (0)