Skip to content

Commit 1a29c1a

Browse files
authored
Merge pull request mocleiri#120 from vikramdattu/support/enable_esp_nn_optimizations
Enabled support for ESP-NN optimizations
2 parents 2712c39 + 127ff3d commit 1a29c1a

File tree

6 files changed

+470
-64
lines changed

6 files changed

+470
-64
lines changed

micropython-modules/microlite/micropython.cmake

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

31-
if(IDF_TARGET STREQUAL "esp32")
32-
set(MICROLITE_PLATFORM "ESP32")
31+
if(NOT MICROPY_DIR)
32+
get_filename_component(MICROPY_DIR ${PROJECT_DIR}/../.. ABSOLUTE)
3333
endif()
3434

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()
35+
# `py.cmake` for `micropy_gather_target_properties` macro usage
36+
include(${MICROPY_DIR}/py/py.cmake)
4237

43-
if(IDF_TARGET STREQUAL "esp32c3")
44-
set(MICROLITE_PLATFORM "ESP32C3")
45-
endif()
38+
include (${CMAKE_CURRENT_LIST_DIR}/micropython_esp.cmake)
4639

4740
get_filename_component(TENSORFLOW_DIR ${PROJECT_DIR}/../../../tensorflow ABSOLUTE)
4841

4942
add_library(microlite INTERFACE)
5043

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-
6144
# needed when we have custom/specialized kernels.
6245
# add_custom_command(
6346
# OUTPUT ${TF_MICROLITE_SPECIALIZED_SRCS}
6447
# COMMAND cd ${TENSORFLOW_DIR} && ${Python3_EXECUTABLE} ${MICROPY_DIR}/py/makeversionhdr.py ${MICROPY_MPVERSION}
6548
# DEPENDS MICROPY_FORCE_BUILD
6649
# )
6750

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-
7851
if (MICROLITE_PLATFORM STREQUAL "RP2")
79-
set (TF_MICROLITE_LOG
52+
set (TF_MICROLITE_LOG
8053
${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/cortex_m_generic/debug_log.cpp
8154
${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/cortex_m_generic/micro_time.cpp
8255
)
8356
endif()
8457

58+
if (CONFIG_IDF_TARGET)
59+
set(TF_ESP_DIR "${CMAKE_CURRENT_LIST_DIR}/../../tflm_esp_kernels/components/tflite-lib")
60+
set(TF_LITE_DIR "${TF_ESP_DIR}/tensorflow/lite")
61+
set(TF_MICRO_DIR "${TF_LITE_DIR}/micro")
62+
set(TF_MICROLITE_LOG
63+
${TF_MICRO_DIR}/debug_log.cc
64+
${TF_MICRO_DIR}/micro_time.cc
65+
)
66+
else()
67+
set(TF_LITE_DIR "${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite")
68+
set(TF_MICRO_DIR "${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro")
69+
endif()
8570

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
71+
# lite c
9472

9573
file(GLOB TF_LITE_C_SRCS
9674
"${TF_LITE_DIR}/c/*.cpp"
9775
"${TF_LITE_DIR}/c/*.c")
9876

99-
# lite core/api
100-
77+
# lite core/api
78+
if (CONFIG_IDF_TARGET)
79+
file(GLOB TF_LITE_API_SRCS
80+
"${TF_LITE_DIR}/core/api/*.cc"
81+
"${TF_LITE_DIR}/core/api/*.c"
82+
"${TF_LITE_DIR}/core/c/*.cc"
83+
"${TF_LITE_DIR}/core/c/*.c")
84+
else()
10185
file(GLOB TF_LITE_API_SRCS
10286
"${TF_LITE_DIR}/core/api/*.cpp"
10387
"${TF_LITE_DIR}/core/api/*.c")
88+
endif()
10489

105-
# lite experimental
90+
# lite experimental
10691

10792
file(GLOB TF_LITE_MICROFRONTEND_SRCS
10893
"${TF_LITE_DIR}/experimental/microfrontend/lib/*.c"
94+
"${TF_LITE_DIR}/experimental/microfrontend/lib/*.cc"
10995
"${TF_LITE_DIR}/experimental/microfrontend/lib/*.cpp")
11096

111-
# lite kernels
97+
# lite kernels
11298

11399
file(GLOB TF_LITE_KERNELS_SRCS
114100
"${TF_LITE_DIR}/kernels/*.c"
115101
"${TF_LITE_DIR}/kernels/*.cpp"
102+
"${TF_LITE_DIR}/kernels/*.cc"
116103
"${TF_LITE_DIR}/kernels/internal/*.c"
117104
"${TF_LITE_DIR}/kernels/internal/*.cpp"
105+
"${TF_LITE_DIR}/kernels/internal/*.cc"
118106
"${TF_LITE_DIR}/kernels/internal/reference/*.c"
119107
"${TF_LITE_DIR}/kernels/internal/reference/*.cpp"
108+
"${TF_LITE_DIR}/kernels/internal/reference/*.cc"
120109
)
121110

122-
# lite schema
111+
# lite schema
123112
file(GLOB TF_LITE_SCHEMA_SRCS
124113
"${TF_LITE_DIR}/schema/*.c"
114+
"${TF_LITE_DIR}/schema/*.cc"
125115
"${TF_LITE_DIR}/schema/*.cpp")
126116

127-
# micro
117+
# micro
128118

129119
file(GLOB TF_MICRO_SRCS
130120
"${TF_MICRO_DIR}/*.c"
121+
"${TF_MICRO_DIR}/*.cc"
131122
"${TF_MICRO_DIR}/*.cpp")
132123

133-
124+
134125
# logs are platform specific and added seperately
135126

136127
list(REMOVE_ITEM TF_MICRO_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/debug_log.cpp)
@@ -139,24 +130,28 @@ list(REMOVE_ITEM TF_MICRO_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/mi
139130
# arena allocator
140131
file(GLOB TF_MICRO_ARENA_ALLOCATOR_SRCS
141132
"${TF_MICRO_DIR}/arena_allocator/*.cpp"
133+
"${TF_MICRO_DIR}/arena_allocator/*.cc"
142134
"${TF_MICRO_DIR}/arena_allocator/*.c")
143135

144-
# micro kernels
136+
# micro kernels
145137

146138
file(GLOB TF_MICRO_KERNELS_SRCS
147139
"${TF_MICRO_DIR}/kernels/*.c"
140+
"${TF_MICRO_DIR}/kernels/*.cc"
148141
"${TF_MICRO_DIR}/kernels/*.cpp")
149142

150-
# micro memory_planner
143+
# micro memory_planner
151144

152145
file(GLOB TF_MICRO_MEMORY_PLANNER_SRCS
153146
"${TF_MICRO_DIR}/memory_planner/*.cpp"
147+
"${TF_MICRO_DIR}/memory_planner/*.cc"
154148
"${TF_MICRO_DIR}/memory_planner/*.c")
155149

156150
# tflite_bridge
157151

158152
file(GLOB TF_MICRO_TFLITE_BRIDGE_SRCS
159153
"${TF_MICRO_DIR}/tflite_bridge/*.cpp"
154+
"${TF_MICRO_DIR}/tflite_bridge/*.cc"
160155
"${TF_MICRO_DIR}/tflite_bridge/*.c")
161156

162157
set (BOARD_ADDITIONAL_SRCS "")
@@ -171,7 +166,7 @@ if (MICROLITE_PLATFORM STREQUAL "RP2")
171166
list(REMOVE_ITEM TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/pooling.cpp)
172167
list(REMOVE_ITEM TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/softmax.cpp)
173168
list(REMOVE_ITEM TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/svdf.cpp)
174-
169+
175170
list(APPEND TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/cmsis_nn/add.cpp)
176171
list(APPEND TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/cmsis_nn/conv.cpp)
177172
list(APPEND TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/cmsis_nn/depthwise_conv.cpp)
@@ -180,7 +175,7 @@ if (MICROLITE_PLATFORM STREQUAL "RP2")
180175
list(APPEND TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/cmsis_nn/pooling.cpp)
181176
list(APPEND TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/cmsis_nn/softmax.cpp)
182177
list(APPEND TF_MICRO_KERNELS_SRCS ${CMAKE_CURRENT_LIST_DIR}/tflm/tensorflow/lite/micro/kernels/cmsis_nn/svdf.cpp)
183-
178+
184179
set (CMSIS_NN_SRCS
185180

186181
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/cmsis_nn/Source/ActivationFunctions/arm_relu6_s8.c
@@ -243,7 +238,7 @@ if (MICROLITE_PLATFORM STREQUAL "RP2")
243238
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/cmsis_nn/Source/SoftmaxFunctions/arm_softmax_s8.c
244239
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/cmsis_nn/Source/SoftmaxFunctions/arm_softmax_s8_s16.c
245240
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/cmsis_nn/Source/SoftmaxFunctions/arm_softmax_u8.c
246-
241+
247242
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/cmsis_nn/Source/SVDFunctions
248243
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/cmsis_nn/Source/SVDFunctions/arm_svdf_s8.c
249244
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/cmsis_nn/Source/SVDFunctions/arm_svdf_state_s16_s8.c
@@ -279,13 +274,47 @@ target_sources(microlite INTERFACE
279274

280275
else()
281276

277+
if (CONFIG_IDF_TARGET)
278+
set(tfmicro_kernels_dir ${TF_MICRO_DIR}/kernels)
279+
# set(tfmicro_nn_kernels_dir
280+
# ${tfmicro_kernels_dir}/)
281+
282+
# remove sources which will be provided by esp_nn
283+
list(REMOVE_ITEM TF_MICRO_KERNELS_SRCS
284+
"${tfmicro_kernels_dir}/add.cc"
285+
"${tfmicro_kernels_dir}/conv.cc"
286+
"${tfmicro_kernels_dir}/depthwise_conv.cc"
287+
"${tfmicro_kernels_dir}/fully_connected.cc"
288+
"${tfmicro_kernels_dir}/mul.cc"
289+
"${tfmicro_kernels_dir}/pooling.cc"
290+
"${tfmicro_kernels_dir}/softmax.cc"
291+
)
292+
293+
# tflm wrappers for ESP_NN
294+
FILE(GLOB ESP_NN_WRAPPERS
295+
"${tfmicro_kernels_dir}/esp_nn/*.cc")
296+
endif()
282297

283-
target_sources(microlite INTERFACE
284298
# microlite micropython module sources
299+
set (MICROLITE_PYTHON_SRCS
285300
${CMAKE_CURRENT_LIST_DIR}/tensorflow-microlite.c
286301
${CMAKE_CURRENT_LIST_DIR}/audio_frontend.c
287-
${CMAKE_CURRENT_LIST_DIR}/openmv-libtf.cpp
288302
${CMAKE_CURRENT_LIST_DIR}/micropython-error-reporter.cpp
303+
)
304+
305+
if (CONFIG_IDF_TARGET)
306+
list(APPEND MICROLITE_PYTHON_SRCS
307+
${CMAKE_CURRENT_LIST_DIR}/openmv-libtf-updated.cpp
308+
)
309+
else()
310+
list(APPEND MICROLITE_PYTHON_SRCS
311+
${CMAKE_CURRENT_LIST_DIR}/openmv-libtf.cpp
312+
)
313+
endif()
314+
315+
target_sources(microlite INTERFACE
316+
# micro_python sources for tflite
317+
${MICROLITE_PYTHON_SRCS}
289318

290319
# tf lite sources
291320
${TF_LITE_C_SRCS}
@@ -302,8 +331,27 @@ target_sources(microlite INTERFACE
302331
${TF_MICRO_TFLITE_BRIDGE_SRCS}
303332

304333
${TF_MICROLITE_LOG}
334+
${ESP_NN_SRCS} # include esp-nn sources for Espressif chipsets
335+
${ESP_NN_WRAPPERS} # add tflm wrappers for ESP_NN
336+
)
305337

306-
)
338+
if (CONFIG_IDF_TARGET)
339+
set(signal_srcs
340+
${TF_ESP_DIR}/signal/micro/kernels/rfft.cc
341+
${TF_ESP_DIR}/signal/micro/kernels/window.cc
342+
${TF_ESP_DIR}/signal/src/kiss_fft_wrappers/kiss_fft_float.cc
343+
${TF_ESP_DIR}/signal/src/kiss_fft_wrappers/kiss_fft_int16.cc
344+
${TF_ESP_DIR}/signal/src/kiss_fft_wrappers/kiss_fft_int32.cc
345+
${TF_ESP_DIR}/signal/src/rfft_float.cc
346+
${TF_ESP_DIR}/signal/src/rfft_int16.cc
347+
${TF_ESP_DIR}/signal/src/rfft_int32.cc
348+
${TF_ESP_DIR}/signal/src/window.cc
349+
)
350+
target_sources(microlite INTERFACE
351+
${CMAKE_CURRENT_LIST_DIR}/python_ops_resolver.cc
352+
${signal_srcs}
353+
)
354+
endif()
307355

308356
endif()
309357

@@ -350,11 +398,22 @@ target_compile_options(microlite INTERFACE
350398
-Wno-error=maybe-uninitialized
351399
)
352400

353-
354-
401+
else()
402+
if (CONFIG_IDF_TARGET)
403+
target_include_directories(microlite INTERFACE
404+
${TF_ESP_DIR}
405+
${TF_ESP_DIR}/third_party/kissfft
406+
${TF_ESP_DIR}/third_party/kissfft/tools
407+
${TF_ESP_DIR}/third_party/flatbuffers/include
408+
${TF_ESP_DIR}/third_party/gemmlowp
409+
${TF_ESP_DIR}/third_party/ruy
410+
${TF_ESP_DIR}/signal/micro/kernels
411+
${TF_ESP_DIR}/signal/src
412+
${TF_ESP_DIR}/signal/src/kiss_fft_wrappers
413+
${ESP_NN_INC}
414+
)
355415
else()
356416

357-
# ESP32
358417
target_include_directories(microlite INTERFACE
359418
${CMAKE_CURRENT_LIST_DIR}
360419
${CMAKE_CURRENT_LIST_DIR}/tflm
@@ -364,13 +423,20 @@ target_include_directories(microlite INTERFACE
364423
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/gemmlowp
365424
${CMAKE_CURRENT_LIST_DIR}/tflm/third_party/ruy
366425
)
426+
endif()
367427

368428
target_compile_definitions(microlite INTERFACE
369429
MODULE_MICROLITE_ENABLED=1
370430
TF_LITE_STATIC_MEMORY=1
371431
TF_LITE_MCU_DEBUG_LOG
372432
NDEBUG
373-
)
433+
)
434+
if (CONFIG_IDF_TARGET)
435+
target_compile_definitions(microlite INTERFACE
436+
ESP_NN=1 # enables esp_nn optimizations if those sources are added
437+
CONFIG_NN_OPTIMIZED=1 # use Optimized vs ansi code from ESP-NN
438+
)
439+
endif()
374440

375441
target_compile_options(microlite INTERFACE
376442
-Wno-error
@@ -388,7 +454,5 @@ target_compile_options(microlite INTERFACE
388454

389455
endif()
390456

391-
392-
393457
target_link_libraries(usermod INTERFACE microlite)
394-
458+
micropy_gather_target_properties(microlite)

0 commit comments

Comments
 (0)