Skip to main content

10.2 TFLM ่ฟ่กŒๆ—ถไธŽๆจกๅž‹ๅตŒๅ…ฅ

ๆœฌ้˜ถๆฎตๆถต็›–ไธค้กนๅ†…ๅฎน๏ผšๅฐ† TensorFlow Lite Micro (TFLM) ่ฟ่กŒๆ—ถ้›†ๆˆๅˆฐ Q2390 / IQ2390 MCU ๅ›บไปถไธญ๏ผŒไปฅๅŠๅฐ†้ข„ๅ…ˆๆž„ๅปบ็š„ int8 ๆจกๅž‹๏ผˆๅœจ็ฌฌ 1 ้˜ถๆฎต็”Ÿๆˆ๏ผ‰็›ดๆŽฅๅตŒๅ…ฅๅ›บไปถ้•œๅƒใ€‚ๅ…ถไธญๅŒ…ๆ‹ฌๅœจ SDLLVM/RISC-V ไธŠๆ‰€้œ€็š„ใ€ไธๆ˜“ๅฏŸ่ง‰็š„ C++ ่ฟ่กŒๆ—ถ่ฎพ็ฝฎใ€‚
##10.2.1 ๆฆ‚่ฟฐ ้›†ๆˆๅŒ…ๅซไบ”ไธชไธๅŒ้ƒจๅˆ†๏ผš
  1. ่Žทๅ– TFLM ๆบ็  โ€” TFLM ๆบ็ ๆœช้šไป“ๅบ“ๆไพ›๏ผˆnot vendored๏ผ‰๏ผŒๅฟ…้กปๆ‰‹ๅŠจ่Žทๅ–
  2. ๆฃ€ๆŸฅๆจกๅž‹ๅนถ้ชŒ่ฏ็ฎ—ๅญๆ”ฏๆŒ โ€” ไปŽๆจกๅž‹ไธญๆๅ–็ฎ—ๅญ็ฑปๅž‹๏ผŒๅนถ็กฎ่ฎค TFLM ๆ”ฏๆŒ่ฟ™ไบ›็ฎ—ๅญ
  3. ้…็ฝฎ LLVM libc++ โ€” SDLLVM ้ป˜่ฎคไธ้…็ฝฎ libc++๏ผ›้œ€่ฆ่ฟ›่กŒ 5 ้กน็‰นๅฎšไฟฎๅค
  4. ๅˆ›ๅปบๆŽจ็†ๆจกๅ— โ€” ๆž„ๅปบๅŒ…ๅซๅตŒๅ…ฅๅผๆจกๅž‹ C ๆ•ฐ็ป„ใ€ๆŽจ็†ๆก†ๆžถ๏ผˆtflite_infer.cc๏ผ‰ใ€Kconfig ๅคดๆ–‡ไปถๅ’Œ CMakeLists.txt ็š„ๆจกๅ—
  5. ้›†ๆˆๅˆฐๅ›บไปถๆž„ๅปบไธญ โ€” ๅœจ main.c ไธญ่ฐƒ็”จ tflite_infer_run()๏ผŒๅนถๅœจ CMake ไธญๆณจๅ†Œ่ฏฅๆจกๅ—

##10.2.2. ็ฌฌ 1 ้ƒจๅˆ† โ€” ่Žทๅ– TFLite Micro ๆบ็ 
่ทฏๅพ„็บฆๅฎš๏ผš ๅœจๆœฌ้˜ถๆฎตไธญ๏ผŒ<wasp_proc> ๆŒ‡ MCU ๅ›บไปถๅทฅไฝœๅŒบ็š„ๆ น็›ฎๅฝ•๏ผŒๅณๅŒ…ๅซ zephyr/ใ€modules/ใ€config/ ็ญ‰็š„็›ฎๅฝ•ใ€‚ๅ‡กๅ‡บ็Žฐๆญคๅค„๏ผŒ่ฏทๆ›ฟๆขไธบๆ‚จ็š„ๅฎž้™…่ทฏๅพ„๏ผˆไพ‹ๅฆ‚ /path/to/your_workspace/wasp_proc๏ผ‰ใ€‚
TFLM ๆจกๅ—ๆกฉๆ–‡ไปถ๏ผˆCMakeLists.txtใ€Kconfig๏ผ‰ไฝไบŽ wasp_proc/zephyr/zephyr/modules/tflite-micro/๏ผŒไฝ†ๅฎž้™…็š„ C++ ๆบ็ ๆ ‘ๅนถไธๅญ˜ๅœจ๏ผŒๅฟ…้กปๆ‰‹ๅŠจๅ…‹้š†ใ€‚ tflite-micro ้กน็›ฎๅœจ west ๆธ…ๅ•๏ผˆzephyr/zephyr/submanifests/optional.yaml๏ผ‰ไธญๅฎšไน‰ไบŽ optional ็ป„๏ผŒ่€Œ Zephyr ่‡ช่บซ็š„ west.yml ้€š่ฟ‡ group-filter: [-optional] ๆ˜พๅผ็ฆ็”จไบ†่ฏฅ็ป„ใ€‚่ฟ™ๆ„ๅ‘ณ็€ west update tflite-micro ๅฐ†ๆ— ๆณ•ๅทฅไฝœ๏ผŒ่ฏทๆ”น็”จ git cloneใ€‚

10.2.2.1. ๅ…‹้š†ๆบ็ 

ๅœจ Docker ๆž„ๅปบๅฎนๅ™จๅ†…๏ผš
ไฟฎ่ฎข็‰ˆๆœฌ็›ดๆŽฅไปŽๆธ…ๅ•ไธญ่ฏปๅ–๏ผŒๅ› ๆญคๆ— ้œ€ไฟฎๆ”นๅณๅฏ้€‚็”จไบŽไปปไฝ• LPAICP ็‰ˆๆœฌใ€‚็”ฑๆญคไบง็”Ÿ็š„ๅˆ†็ฆป HEAD๏ผˆdetached HEAD๏ผ‰็Šถๆ€ๆ˜ฏ้ข„ๆœŸไธ”ๆญฃ็กฎ็š„ใ€‚

10.2.2.2. ้ชŒ่ฏ


10.2.3. ็ฌฌ 2 ้ƒจๅˆ† โ€” ๆฃ€ๆŸฅๆจกๅž‹ๅนถ้ชŒ่ฏ็ฎ—ๅญๆ”ฏๆŒ

ๅœจ็ผ–ๅ†™ไปปไฝ•ๅ›บไปถไปฃ็ ไน‹ๅ‰๏ผŒๆˆ‘ไปฌ้œ€่ฆไปŽๆจกๅž‹ไธญ่Žทๅ–ไธค้กนไฟกๆฏ๏ผš
  1. ๆจกๅž‹ไฝฟ็”จไบ†ๅ“ชไบ›็ฎ—ๅญ โ€” TFLM ่ฟ่กŒๆ—ถ่ฆๆฑ‚ๅœจ่ฟ่กŒๆŽจ็†ไน‹ๅ‰ๆ˜พๅผๆณจๅ†Œๆจกๅž‹ไฝฟ็”จ็š„ๆฏไธช็ฎ—ๅญใ€‚ๅฆ‚ๆžœ็ผบๅฐ‘ไปปไฝ•็ฎ—ๅญ๏ผŒๅ›บไปถๅฐ†ๅœจๅฏๅŠจๆ—ถๅ› ๆ— ๆณ•่งฃๆž็ฎ—ๅญ่€ŒๆŠฅ้”™ใ€‚ๆญคๆญฅ้ชคๅฏ็กฎๅฎšๆจกๅž‹ๆ‰€้œ€็š„็กฎๅˆ‡็ฎ—ๅญ้›†ๅˆ๏ผŒไปฅไพฟๆ‚จๅœจ ็ฌฌ 5 ้ƒจๅˆ† ไธญ้›†ๆˆๆŽจ็†ๆก†ๆžถๆ—ถ็Ÿฅ้“้œ€่ฆๆณจๅ†Œๅ“ชไบ›็ฎ—ๅญใ€‚
  2. ่พ“ๅ…ฅ/่พ“ๅ‡บ้‡ๅŒ–ๅ‚ๆ•ฐ๏ผˆscale + zero_point๏ผ‰โ€” ๅฆ‚ๆžœๆจกๅž‹้‡‡็”จ int8 ้‡ๅŒ–๏ผŒๅˆ™ๆตฎ็‚น่พ“ๅ…ฅๅœจไผ ้€’็ป™ๆŽจ็†ๆก†ๆžถไน‹ๅ‰ๅฟ…้กป้ข„ๅ…ˆ้‡ๅŒ–ไธบ int8ใ€‚

10.2.3.1. ้€‰้กน A โ€” flatc๏ผˆๅฎŒๆ•ดๆ‹“ๆ‰‘่งฃ็  โ€” ๆŽจ่๏ผ‰

ไฝฟ็”จ TFLM schema ๅฐ†ๆจกๅž‹ไบŒ่ฟ›ๅˆถ่งฃ็ ไธบไบบ็ฑปๅฏ่ฏป็š„ JSONใ€‚ๅฏ่Žทๅพ—๏ผšๆ‰€ๆœ‰ๅผ ้‡็š„็ฎ—ๅญ็ฑปๅž‹ใ€ๅผ ้‡ๅ็งฐใ€ๅฝข็Šถๅ’Œ้‡ๅŒ–ๅ‚ๆ•ฐใ€‚ ๆญฅ้ชค 1 โ€” ่ฟ่กŒ flatc ่งฃ็ ๆจกๅž‹๏ผš
่ฟ™ไผšๅœจๅฝ“ๅ‰็›ฎๅฝ•ไธญ็”Ÿๆˆ cnn1d_minimal_int8.jsonใ€‚ ๆญฅ้ชค 2 โ€” ไปŽ JSON ไธญๆๅ–็ฎ—ๅญๅˆ—่กจ๏ผš
ๆญฅ้ชค 3 โ€” ๅฐ†ๆฏไธช็ฎ—ๅญไธŽ 1.3.3 ไธญ็š„ๆ”ฏๆŒ็ฎ—ๅญๅˆ—่กจ่ฟ›่กŒไบคๅ‰ๆ ธๅฏนใ€‚

10.2.3.2. ้€‰้กน B โ€” tf.lite.Interpreter๏ผˆไป…้‡ๅŒ–ๅ‚ๆ•ฐ๏ผŒๆ— ้œ€ flatc๏ผ‰

ๅœจ flatc ไธๅฏ็”จๆ—ถไฝฟ็”จใ€‚ๅฏ่Žทๅพ—่พ“ๅ…ฅ/่พ“ๅ‡บ้‡ๅŒ–ๅ‚ๆ•ฐ๏ผˆscaleใ€zero_point๏ผ‰ใ€‚ไธไผšๆšด้œฒ็ฎ—ๅญ็ฑปๅž‹ โ€” ่ฏทไฝฟ็”จ้€‰้กน A ่Žทๅ–็ฎ—ๅญๅˆ—่กจใ€‚
tf.lite.Interpreter ไธไผšๆšด้œฒ็ฎ—ๅญ็ฑปๅž‹ โ€” ่ฏทไฝฟ็”จ้€‰้กน A๏ผˆflatc๏ผ‰่Žทๅ–็ฎ—ๅญๅˆ—่กจใ€‚

10.2.3.3. ๆญค TFLM ๆž„ๅปบๆ”ฏๆŒ็š„ๆ‰€ๆœ‰็ฎ—ๅญ

TFLM ๆ‰€ๆ”ฏๆŒ็ฎ—ๅญ็š„ๆƒๅจๆฅๆบๆ˜ฏ micro_mutable_op_resolver.h โ€” ่ฏฅๆ–‡ไปถไธญๅฃฐๆ˜Ž็š„ๆฏไธช Add*() ๆ–นๆณ•้ƒฝๅฏนๅบ”ๆ‰€ไธ‹่ฝฝ็š„็กฎๅˆ‡ไฟฎ่ฎข็‰ˆๆœฌๆ‰€ๆ”ฏๆŒ็š„ไธ€ไธช็ฎ—ๅญใ€‚
ๅ‘ๅธƒๆ ‡็ญพ zephyr_20240627 ็š„ๅฎŒๆ•ดๆ”ฏๆŒ็ฎ—ๅญๅˆ—่กจ โ€” ๅ…ฑ 114 ไธช็ฎ—ๅญ๏ผš
ๆฏไธช็ฎ—ๅญๅฏนๅบ”็š„ resolver ๆ–นๆณ•ไธบ Add + ็ฎ—ๅญๅ็งฐ โ€” ไพ‹ๅฆ‚ Conv2D โ†’ AddConv2D()๏ผŒFullyConnected โ†’ AddFullyConnected()ใ€‚

10.2.3.4. ๅ‚่€ƒ โ€” ็คบไพ‹ๆจกๅž‹ๅทฒ็กฎ่ฎค็š„็ฎ—ๅญ

cnn1d_minimal_int8.tflite ไธญ็š„ๆ‰€ๆœ‰็ฎ—ๅญใ€ๅฏนๅบ”็š„ TFLM ๅ†…ๆ ธๆ–‡ไปถไปฅๅŠ resolver ๆ–นๆณ•๏ผš ๅฆ‚ๆžœๆŸไธช็ฎ—ๅญๆœชๆณจๅ†Œ๏ผŒๆ‚จๅฐ†็œ‹ๅˆฐไปฅไธ‹้”™่ฏฏไน‹ไธ€๏ผš ็ผ–่ฏ‘ๆ—ถ๏ผˆๆ–นๆณ•ๅ็งฐ้”™่ฏฏๆˆ–็ผบๅคฑ๏ผ‰๏ผš
่ฟ่กŒๆ—ถๅœจ AllocateTensors() ้˜ถๆฎต๏ผˆ็ฎ—ๅญๆœชๆณจๅ†Œ๏ผ‰๏ผš

10.2.4. ็ฌฌ 3 ้ƒจๅˆ† โ€” ้…็ฝฎ LLVM libc++๏ผˆ5 ๆญฅไฟฎๅค๏ผ‰

10.2.4.1. ้ป˜่ฎคๆ–นๆณ•ไธบไฝ•ๅคฑ่ดฅ

่ฆไฝฟ็”จ TFLM๏ผˆไปฅ C++ ็ผ–ๅ†™๏ผ‰๏ผŒZephyr ้œ€่ฆ C++ ๆ ‡ๅ‡†ๅบ“ใ€‚่‡ช็„ถ็š„่ตท็‚นๆ˜ฏๅฏ็”จ CONFIG_LIBCXX_LIBCPP=yใ€‚็„ถ่€Œๅœจ SDLLVM ไธŠ๏ผŒ่ฟ™ไผš่งฆๅ‘ไธ€ๆก็ ดๅๆž„ๅปบ็š„ Kconfig ไพ่ต–้“พใ€‚่ฏฅๆ•…้šœไผš่กจ็Žฐไธบไธ€ไธชๅฎŒๅ…จไธ็›ธๅ…ณ็š„ๅ†…ๆ ธๆ–‡ไปถไธญ็š„้”™่ฏฏ๏ผš

10.2.4.2. 4 ๆญฅไฟฎๅค

10.2.4.2.1. ๆญฅ้ชค 1 โ€” ไปŽ TFLM Kconfig ไธญ็งป้™ค select REQUIRES_FULL_LIBCPP

ๆ–‡ไปถ๏ผšzephyr/zephyr/modules/tflite-micro/Kconfig ไปŽ config TENSORFLOW_LITE_MICRO ๅ†…้ƒจ็งป้™ค select REQUIRES_FULL_LIBCPP ่ฟ™ไธ€่กŒใ€‚่ฟ™ๆ˜ฏไพ่ต–็บง่”็š„ๆ นๆบ โ€” ็งป้™คๅฎƒๅฏ้˜ฒๆญข Zephyr ๅœจ SDLLVM ไธŠ่งฆๅ‘ๅทฒๆŸๅ็š„ REQUIRES_FULL_LIBC ่ทฏๅพ„ใ€‚

10.2.4.2.2. ๆญฅ้ชค 2 โ€” ไฝฟ็”จ EXTERNAL_MODULE_LIBCPP๏ผŒ่€Œ้ž EXTERNAL_LIBCPP

ๆญคๅค„ๆ— ้œ€ๆ“ไฝœ โ€” ่ฏฅ่ฎพ็ฝฎๅŒ…ๅซๅœจ็ฌฌ 2.4.4 ่Š‚ๅˆ›ๅปบ็š„ๆ–ฐๆ–‡ไปถไธญใ€‚

10.2.4.2.3. ๆญฅ้ชค 3 โ€” ้€š่ฟ‡ -I ่€Œ้ž -isystem ๆณจๅ…ฅ libc++ ๅŒ…ๅซ่ทฏๅพ„

ๆญคๅค„ๆ— ้œ€ๆ“ไฝœ โ€” ่ฏฅ่ฐƒ็”จๆ˜ฏ็ฌฌ 2.4.3 ่Š‚ไธญๆทปๅŠ ็š„ๅฎŒๆ•ดไปฃ็ ๅ—็š„ไธ€้ƒจๅˆ†ใ€‚ -I ็›ฎๅฝ•ไผšๅ…ˆไบŽไปปไฝ• -isystem ็›ฎๅฝ•่ขซๆœ็ดขใ€‚้€š่ฟ‡ไปฅ -I BEFORE ๆ–นๅผๆณจๅ…ฅ libc++ ๅคดๆ–‡ไปถ๏ผŒclang ไผš้ฆ–ๅ…ˆๆ‰พๅˆฐ libc++ ่‡ช่บซ็š„ <stdio.h>/<string.h> ๅŒ…่ฃ…ๅคดๆ–‡ไปถ๏ผŒๅฎƒไปฌๅ†้€š่ฟ‡ #include_next ้“พๆŽฅๅˆฐ musl โ€” ่ฟ™ๆญฃๆ˜ฏ C++ ็ฟป่ฏ‘ๅ•ๅ…ƒ็š„ๆญฃ็กฎ่งฃๆž้กบๅบใ€‚

10.2.4.2.4. ๆญฅ้ชค 4 โ€” ไฝฟ็”จ -DNDEBUG ็ผ–่ฏ‘ C++ ็ฟป่ฏ‘ๅ•ๅ…ƒ

ๆญคๅค„ๆ— ้œ€ๆ“ไฝœ โ€” ่ฏฅๆ ‡ๅฟ—ๆ˜ฏ็ฌฌ 2.4.3 ่Š‚ไธญๆทปๅŠ ็š„ๅฎŒๆ•ดไปฃ็ ๅ—็š„ไธ€้ƒจๅˆ†ใ€‚ musl ็š„ assert() ๅฎไผšๅฑ•ๅผ€ไธบ __assert_fail()๏ผŒ่€Œ picolibc ๅนถไธๆไพ›่ฏฅๅ‡ฝๆ•ฐใ€‚-DNDEBUG ไผšๅœจ C++ ็ฟป่ฏ‘ๅ•ๅ…ƒไธญ็ผ–่ฏ‘ๆމๆ‰€ๆœ‰ assert ่ฐƒ็”จใ€‚ๅ…ถไฝœ็”จ่Œƒๅ›ด้™ๅฎšไธบ $<$<COMPILE_LANGUAGE:CXX>:-DNDEBUG>๏ผŒๅ› ๆญค C ไปฃ็ ไธๅ—ๅฝฑๅ“ใ€‚

10.2.4.3. ๅฎŒๆ•ด็š„ CMake ้…็ฝฎไปฃ็ ๅ—

ๆ–‡ไปถ๏ผšmodules/hal/qcom/core/config/CMakeLists.txt๏ผˆๅทฒๆœ‰ๆ–‡ไปถ โ€” ๅœจๆœซๅฐพๆทปๅŠ ๆญคๅฎŒๆ•ดไปฃ็ ๅ—๏ผ‰ใ€‚่ฏฅไปฃ็ ๅ—ไปฅ CONFIG_EXTERNAL_MODULE_LIBCPP ไธบๆกไปถ๏ผŒๅ› ๆญคไป…ๅœจๅˆๅนถ TFLM Kconfig ็‰‡ๆฎตๆ—ถๆ‰ไผš็”Ÿๆ•ˆใ€‚

10.2.4.4. shikra_lpaicp_tflite.conf

10.2.4.4.1. ๆญฅ้ชค 1 โ€” ๅˆ›ๅปบ shikra_lpaicp_tflite.conf

ๅœจ zephyr/kernel/config/shikra_lpaicp_tflite.conf ๅˆ›ๅปบๆ–ฐๆ–‡ไปถ๏ผš

10.2.4.4.2. ๆญฅ้ชค 2 โ€” ๅœจ config.yml ไธญๆณจๅ†Œ่ฏฅๆ–‡ไปถ

ๆ–‡ไปถ๏ผšzephyr/kernel/config/config.yml๏ผˆๅทฒๆœ‰ๆ–‡ไปถ โ€” ๆทปๅŠ ไธ€ไธชๆ–ฐๆก็›ฎ๏ผ‰๏ผš
ไธบไป€ไนˆไฝฟ็”จๅ•็‹ฌ็š„ๆ–‡ไปถ๏ผŒ่€Œไธๆ˜ฏๆทปๅŠ ๅˆฐ shikra_lpaicp.conf๏ผŸ ็Žฐๆœ‰ๆก็›ฎไฝฟ็”จๆญฃๅˆ™่กจ่พพๅผ (^|shikra_)lpaicp_.*๏ผŒๅฎƒๅŒๆ—ถๅŒน้…็กฌไปถ็›ฎๆ ‡๏ผˆSHIKRA_LPAICP_TEST๏ผ‰ๅ’Œไฝฟ็”จ Zephyr-SDK GCC ็š„ QEMU ไปฟ็œŸๅ˜ไฝ“ใ€‚ๅฐ† TFLM ็‰นๅฎšไบŽ SDLLVM ็š„ libc++ ้…็ฝฎๆทปๅŠ ๅˆฐ shikra_lpaicp.conf ไผš็ ดๅๅŸบไบŽ GCC ็š„ QEMU ๆž„ๅปบใ€‚่Œƒๅ›ดๆ›ด็ช„็š„ๆญฃๅˆ™่กจ่พพๅผ shikra_lpaicp_.* ไป…ๅŒน้…็กฌไปถ็›ฎๆ ‡ใ€‚

10.2.5. ็ฌฌ 4 ้ƒจๅˆ† โ€” ๅˆ›ๅปบๆŽจ็†ๆจกๅ—

10.2.5.1. ๆญฅ้ชค 1 โ€” ็”Ÿๆˆ src/model_data.cpp ๅ’Œ src/input_data.cpp

้ฆ–ๅ…ˆๅˆ›ๅปบๆจกๅ—็›ฎๅฝ•๏ผŒ็„ถๅŽๅฐ†็ฌฌ 1 ้˜ถๆฎต็”Ÿๆˆ็š„ๆจกๅž‹ๅ’Œ่พ“ๅ…ฅๆ–‡ไปถ่ฝฌๆขไธบ C ๅญ—่Š‚ๆ•ฐ็ป„ใ€‚่ฏทๅœจๅŒ…ๅซ็ฌฌ 1 ้˜ถๆฎตๆบๆ–‡ไปถ็š„็›ฎๅฝ•ไธญ่ฟ่กŒ่ฟ™ไบ›ๅ‘ฝไปคใ€‚
ๅฐ† <wasp_proc> ๆ›ฟๆขไธบๆ‚จ็š„ wasp_proc MCU ไปฃ็ ๅบ“่ทฏๅพ„ใ€‚ ็”Ÿๆˆ็š„ๆ–‡ไปถๅฆ‚ไธ‹ๆ‰€็คบ๏ผš
ๆจกๅž‹ๆ•ฐ็ป„ไธŠ็š„ alignas(8)๏ผš TFLM ็š„ FlatBuffers ่งฃๆžๅ™จ่ฆๆฑ‚ๆจกๅž‹ๅญ—่Š‚ๆ•ฐ็ป„่‡ณๅฐ‘ๆŒ‰ 4 ๅญ—่Š‚ๅฏน้ฝใ€‚ๆ— ่ฎบ้“พๆŽฅๅ™จๅฐ†่ฏฅ็ฌฆๅทๆ”พ็ฝฎๅœจไฝ•ๅค„๏ผŒalignas(8) ้ƒฝ่ƒฝไฟ่ฏๆปก่ถณ่ฟ™ไธ€่ฆๆฑ‚ใ€‚

10.2.5.2. ๆญฅ้ชค 2 โ€” ๅˆ›ๅปบ inc/tflite_infer.h

ๆ–‡ไปถ๏ผšmodules/hal/qcom/core/tflite_infer/inc/tflite_infer.h๏ผˆๆ–ฐๆ–‡ไปถ๏ผ‰ใ€‚

10.2.5.2.1. ่ฐƒๆ•ด TFLI_ARENA_KB

TFLI_ARENA_KB ่ฎพ็ฝฎๅผ ้‡ arena ็š„ๅคงๅฐ โ€” ่ฟ™ๆ˜ฏ TFLM ็”จไบŽ่พ“ๅ…ฅ/่พ“ๅ‡บๅผ ้‡ใ€ๅฑ‚้—ดไธญ้—ดๆฟ€ๆดป็ผ“ๅ†ฒๅŒบๅŠๅ…ถๅ†…้ƒจๅˆ†้…ๅ™จๅ…ƒๆ•ฐๆฎ็š„่ฟž็ปญๅ†…ๅญ˜ๅ—ใ€‚ๅฎƒๅœจ tflite_infer_run() ๅผ€ๅง‹ๆ—ถ้€š่ฟ‡ k_malloc ไปŽ็ณป็ปŸๅ †ไธญๅˆ†้…ใ€‚ ๅ–ๅ€ผไธๅฝ“ๆ—ถไผšๅ‡บ็Žฐ็š„้—ฎ้ข˜๏ผš ่ฟ™ไธค็งๆ•…้šœ้ƒฝไผšๅฏผ่‡ด tflite_infer_run() ๆๅ‰่ฟ”ๅ›ž โ€” g_tfli_batches ไฟๆŒไธบ 0๏ผŒๆ‰€ๆœ‰ๅปถ่ฟŸๅ…จๅฑ€ๅ˜้‡ไฟๆŒๅ…ถๅˆๅง‹ๅ€ผใ€‚ ๅฆ‚ไฝ•็กฎๅฎšๅˆ้€‚็š„ๅ€ผ โ€” ไฝฟ็”จ g_tfli_arena_used ่ฟ›่กŒๆต‹้‡๏ผš
  1. ๅฐ† TFLI_ARENA_KB ่ฎพ็ฝฎไธบไธ€ไธชๅ……่ฃ•็š„ๅˆๅง‹ๅ€ผ๏ผˆไพ‹ๅฆ‚ 32๏ผ‰โ€” ่ถณๅคŸๅคงไปฅไฟ่ฏ AllocateTensors() ๆˆๅŠŸใ€‚
  2. ๆž„ๅปบใ€็ƒงๅ†™ใ€ๅฏๅŠจ๏ผŒๅนถๅœจ T32 ไธญ่ฟ่กŒ read_tflite_infer.cmmใ€‚
  3. ็กฎ่ฎค g_tfli_status == 0 ไธ” g_tfli_batches >= 1ใ€‚
  4. ไปŽ T32 Var.View ็ช—ๅฃ่ฏปๅ– g_tfli_arena_used โ€” ่ฟ™ๆ˜ฏ TFLM ๆ‰€้œ€็š„็กฎๅˆ‡ๅญ—่Š‚ๆ•ฐใ€‚
  5. ่ฎก็ฎ—ๆœ€ๅฐๅฎ‰ๅ…จๅ€ผๅนถๆ›ดๆ–ฐๅคดๆ–‡ไปถ๏ผš
  1. ้‡ๆ–ฐๆž„ๅปบๅนถ้‡ๆ–ฐ็ƒงๅ†™ใ€‚้ชŒ่ฏ g_tfli_arena_used ไปๅฐไบŽ g_tfli_arena_sizeใ€‚
ๅ‚่€ƒๆจกๅž‹็š„้…็ฝฎๅ€ผ๏ผš TFLI_ARENA_KB = 4๏ผˆ4,096 ๅญ—่Š‚๏ผ‰ใ€‚่ฟ™ๆ˜ฏๅ‚่€ƒไปฃ็ ๅบ“ไธญ cnn1d_minimal_int8.tflite ๆ‰€ไฝฟ็”จ็š„ๅ€ผใ€‚ๆˆๅŠŸ่ฟ่กŒๅŽ๏ผŒ่ฏทๅœจ็›ฎๆ ‡่ฎพๅค‡ไธŠๆต‹้‡ g_tfli_arena_used๏ผŒไปฅ็กฎ่ฎคๆ‚จ็š„ๆจกๅž‹็š„ไฝฟ็”จๆƒ…ๅ†ตใ€‚
TFLI_ARENA_KB ๅฏน RAM ็š„ๅฝฑๅ“๏ผš arena ๅœจ่ฟ่กŒๆ—ถไปŽ็ณป็ปŸๅ †ไธญๅˆ†้… โ€” ๅฎƒไธไผš็›ดๆŽฅๅขžๅŠ ้™ๆ€้•œๅƒๅคงๅฐใ€‚ไฝ†ๆ˜ฏ๏ผŒๅ †็š„ๅŽๅค‡็ผ“ๅ†ฒๅŒบ๏ผˆkheap_buf__system_heap๏ผ‰ๆ˜ฏไธ€ไธช้™ๆ€้“พๆŽฅๆฎต๏ผŒๅ…ถๅคงๅฐ็”ฑ CONFIG_HEAP_MEM_POOL_SIZE ๅ†ณๅฎš๏ผˆๅœจ shikra_lpaicp.conf ไธญ่ฎพ็ฝฎไธบ 32768๏ผ‰ใ€‚ไป…ๅ‡ๅฐ TFLI_ARENA_KB ๅนถไธไผšๅ‡ๅฐ‘้™ๆ€ RAMใ€‚่‹ฅ่ฆๅ›žๆ”ถ้™ๆ€ RAM๏ผŒ่ฟ˜้œ€็›ธๅบ”้™ไฝŽ CONFIG_HEAP_MEM_POOL_SIZE โ€” ็กฎไฟๆ–ฐ็š„ๅคงๅฐ่ƒฝๅคŸ่ฆ†็›– TFLI_ARENA_KB * 1024 + 16 ไปฅๅŠๅ…ถไป–ๆ‰€ๆœ‰ k_malloc ่ฐƒ็”จๆ–น็š„้œ€ๆฑ‚ใ€‚

10.2.5.3. ๆญฅ้ชค 3 โ€” ๅˆ›ๅปบ CMakeLists.txt

ๆ–‡ไปถ๏ผšmodules/hal/qcom/core/tflite_infer/CMakeLists.txt๏ผˆๆ–ฐๆ–‡ไปถ๏ผ‰ใ€‚ไปฅ CONFIG_TENSORFLOW_LITE_MICRO ไธบๆกไปถใ€‚

10.2.5.4. ๆญฅ้ชค 4 โ€” ๅˆ›ๅปบ src/tflite_infer.cc

ๆ–‡ไปถ๏ผšmodules/hal/qcom/core/tflite_infer/src/tflite_infer.cc๏ผˆๆ–ฐๆ–‡ไปถ๏ผ‰ใ€‚ๆฏไธชๆ‰นๆฌก่ฟ่กŒ TFLI_ITERS ๆฌก่ฎกๆ—ถ็š„ Invoke() ่ฐƒ็”จ๏ผˆๅœจไธ€ๆฌก้ข„็ƒญไน‹ๅŽ๏ผ‰๏ผŒ็„ถๅŽๅฐ†ๆฏๆ‰นๆฌกไปฅๅพฎ็ง’ใ€QTMR tick ๅ’Œ CPU ๅ‘จๆœŸ่กจ็คบ็š„ๆœ€ๅฐ/ๅนณๅ‡/ๆœ€ๅคงๅปถ่ฟŸๅ‘ๅธƒๅˆฐ g_tfli_* volatile ๅ…จๅฑ€ๅ˜้‡ไธญใ€‚
ๅ…ณไบŽ __attribute__((retain)) ็š„่ฏดๆ˜Ž๏ผš g_tfli_arena_size ๅ’Œ g_tfli_iters ไป…ๅœจๅˆๅง‹ๅŒ–ๆ—ถๅ†™ๅ…ฅ๏ผŒๅ›บไปถไปฃ็ ไปŽไธ่ฏปๅ–ๅฎƒไปฌใ€‚ๅฆ‚ๆžœๆฒกๆœ‰ __attribute__((retain))๏ผŒๅณไฝฟๅฎƒไปฌๆ˜ฏ volatile๏ผŒ้“พๆŽฅๅ™จ็š„ --gc-sections ่ฟ‡็จ‹ไนŸไผšๆ‚„ๆ— ๅฃฐๆฏๅœฐไธขๅผƒๅฎƒไปฌ็š„ ELF ๆฎต โ€” volatile ๅฏ้˜ฒๆญข็ผ–่ฏ‘ๅ™จๅฐ†ๅ…ถไผ˜ๅŒ–ๆމ๏ผŒไฝ†ๆ— ๆณ•้˜ฒๆญข้“พๆŽฅๅ™จ GCใ€‚retain ๅฑžๆ€งไผšๅฐ†่ฏฅๆฎตๆ ‡่ฎฐไธบๅง‹็ปˆๅญ˜ๆดป๏ผŒไปŽ่€Œ็กฎไฟ่ฟ™ไบ›็ฌฆๅทๅฏน T32 ไฟๆŒๅฏ่งใ€‚

10.2.6. ็ฌฌ 5 ้ƒจๅˆ† โ€” ้›†ๆˆๅˆฐๅ›บไปถๆž„ๅปบไธญ

10.2.6.1. ๆญฅ้ชค 1 โ€” ๅฐ† tflite_infer_run() ้›†ๆˆๅˆฐ main.c ไธญ

ๆ–‡ไปถ๏ผšmodules/hal/qcom/core/main/src/main.c
ๆ”พ็ฝฎไฝ็ฝฎ๏ผš tflite_infer_run() ๆ”พๅœจ CONFIG_QC_CLK_READY ไปฃ็ ๅ—ไน‹ๅŽใ€‚ๅฆ‚ๆžœ่ฏฅไปฃ็ ๅ—ไธๅญ˜ๅœจ๏ผŒๅˆ™ๅฐ†ๅ…ถ็›ดๆŽฅๆ”พๅœจๅˆๅง‹็š„ LOG_INF / printk ่กŒไน‹ๅŽ๏ผŒๆ•ˆๆžœ็›ธๅŒใ€‚

10.2.6.2. ๆญฅ้ชค 2 โ€” ๅœจ CMake ไธญๆณจๅ†Œ่ฏฅๆจกๅ—

ๆ–‡ไปถ๏ผšmodules/hal/qcom/core/config/CMakeLists.txt๏ผˆๅทฒๆœ‰ๆ–‡ไปถ โ€” ๅœจ add_subdirectory_ifdef ไปฃ็ ๅ—ๆœซๅฐพๆทปๅŠ ไธ€่กŒ๏ผ‰๏ผš
ๅฐ†ๅ…ถๆ”พๅœจๆœ€ๅŽไธ€ไธช็Žฐๆœ‰็š„ add_subdirectory_ifdef ่กŒไน‹ๅŽ๏ผš

10.2.7. RAM ่ฏดๆ˜Ž

ๅœจๆทปๅŠ  TFLM ไน‹ๅ‰๏ผŒShikra LPAICP ๅ›บไปถๅคง็บฆๆœ‰ 40 KB ็š„็ฉบ้—ฒ RAMใ€‚TFLM ็š„้™ๆ€ไปฃ็ ๅ ็”จ๏ผˆ3 ไธช็ฎ—ๅญๅญ้›†็บฆ 25 KB๏ผ‰ใ€ๆจกๅž‹ๆ•ฐๆฎ๏ผˆ็บฆ 2 KB๏ผ‰ไปฅๅŠๅ †ๅˆ†้…ๅฏ่ƒฝไผšไฝฟ้•œๅƒๆŽฅ่ฟ‘ 3 MB ็š„ไธŠ้™ใ€‚ ๅฆ‚ๆžœๆž„ๅปบๅคฑ่ดฅๅนถๅ‡บ็Žฐ๏ผš
่ฏทๅœจ zephyr/kernel/config/config.yml ไธญๆณจ้‡Šๆމ log.conf๏ผš
log.conf ไผšๅฏ็”จ Zephyr ็š„ๅปถ่ฟŸๆ—ฅๅฟ—ๅญ็ณป็ปŸ๏ผšไธ€ไธช 16 KB ็š„็Žฏๅฝข็ผ“ๅ†ฒๅŒบไปฅๅŠไธ€ไธชๅ…ทๆœ‰ 4 KB ๆ ˆ็š„ไธ“็”จๅŽๅฐ็บฟ็จ‹๏ผŒๅ…ฑๅ ็”จ็บฆ 20 KB ้™ๆ€ RAMใ€‚็”ฑไบŽๆญคๅ›บไปถไฝฟ็”จ T32 RAM ๆŽงๅˆถๅฐ่ฟ›่กŒ่พ“ๅ‡บ๏ผˆๆ—  UART๏ผ‰๏ผŒๅปถ่ฟŸๆ—ฅๅฟ—็บฟ็จ‹ๆฒกๆœ‰่พ“ๅ‡บ่ทฏๅพ„ใ€‚ๅฐ†ๅ…ถๆณจ้‡Šๆމๅฏๅ›žๆ”ถ็บฆ 20 KB๏ผŒๅŒๆ—ถ shikra_lpaicp.conf ไธญ็š„ CONFIG_LOG_MODE_MINIMAL=y ไปไฟๆŒ็”Ÿๆ•ˆใ€‚

10.2.8. Kconfig ๆ ‡ๅฟ—ๅ‚่€ƒ

ไธบ TFLM ้›†ๆˆ่€ŒๆทปๅŠ ๆˆ–ไฟฎๆ”น็š„ๆ‰€ๆœ‰ Kconfig ็ฌฆๅท๏ผš ๆŽจ็†ๆก†ๆžถๅ‚ๆ•ฐ๏ผˆTFLI_ARENA_KBใ€TFLI_ITERSใ€TFLI_BATCH_SLEEP_MS๏ผ‰ๆ˜ฏ inc/tflite_infer.h ไธญ็š„ #define ๅธธ้‡ใ€‚็›ดๆŽฅ็ผ–่พ‘่ฏฅๆ–‡ไปถๅณๅฏ่ฟ›่กŒ่ฐƒๆ•ด๏ผŒๆ— ้œ€้‡ๆ–ฐ็ผ–่ฏ‘ๅ…ถไป–ไปปไฝ•ๆ–‡ไปถใ€‚ๆœ‰ๅ…ณ arena ๅคงๅฐ็กฎๅฎšๆญฅ้ชค๏ผŒ่ฏทๅ‚้˜…็ฌฌ 2.5.2.1 ่Š‚ใ€‚