mlonmcu 0.3.0.dev0__3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mlonmcu/__init__.py +26 -0
- mlonmcu/artifact.py +172 -0
- mlonmcu/cli/__init__.py +19 -0
- mlonmcu/cli/build.py +119 -0
- mlonmcu/cli/cleanup.py +75 -0
- mlonmcu/cli/common.py +227 -0
- mlonmcu/cli/compile.py +87 -0
- mlonmcu/cli/env.py +68 -0
- mlonmcu/cli/export.py +93 -0
- mlonmcu/cli/flow.py +67 -0
- mlonmcu/cli/helper/__init__.py +18 -0
- mlonmcu/cli/helper/filter.py +25 -0
- mlonmcu/cli/helper/parse.py +159 -0
- mlonmcu/cli/init.py +130 -0
- mlonmcu/cli/load.py +87 -0
- mlonmcu/cli/main.py +116 -0
- mlonmcu/cli/models.py +48 -0
- mlonmcu/cli/run.py +56 -0
- mlonmcu/cli/setup.py +136 -0
- mlonmcu/cli/tune.py +48 -0
- mlonmcu/config.py +219 -0
- mlonmcu/context/__init__.py +22 -0
- mlonmcu/context/context.py +545 -0
- mlonmcu/context/read_write_filelock.py +327 -0
- mlonmcu/environment/__init__.py +18 -0
- mlonmcu/environment/config.py +214 -0
- mlonmcu/environment/environment.py +501 -0
- mlonmcu/environment/init.py +191 -0
- mlonmcu/environment/list.py +81 -0
- mlonmcu/environment/loader.py +250 -0
- mlonmcu/environment/templates.py +69 -0
- mlonmcu/environment/writer.py +117 -0
- mlonmcu/feature/__init__.py +18 -0
- mlonmcu/feature/feature.py +230 -0
- mlonmcu/feature/features.py +1537 -0
- mlonmcu/feature/type.py +33 -0
- mlonmcu/flow/__init__.py +61 -0
- mlonmcu/flow/backend.py +234 -0
- mlonmcu/flow/framework.py +69 -0
- mlonmcu/flow/tflm/__init__.py +23 -0
- mlonmcu/flow/tflm/backend/__init__.py +23 -0
- mlonmcu/flow/tflm/backend/backend.py +47 -0
- mlonmcu/flow/tflm/backend/tflmc.py +129 -0
- mlonmcu/flow/tflm/backend/tflmi.py +385 -0
- mlonmcu/flow/tflm/framework.py +81 -0
- mlonmcu/flow/tvm/__init__.py +23 -0
- mlonmcu/flow/tvm/backend/__init__.py +26 -0
- mlonmcu/flow/tvm/backend/backend.py +282 -0
- mlonmcu/flow/tvm/backend/model_info.py +307 -0
- mlonmcu/flow/tvm/backend/python_utils.py +36 -0
- mlonmcu/flow/tvm/backend/tuner.py +41 -0
- mlonmcu/flow/tvm/backend/tvmaot.py +162 -0
- mlonmcu/flow/tvm/backend/tvmaotplus.py +51 -0
- mlonmcu/flow/tvm/backend/tvmc_utils.py +172 -0
- mlonmcu/flow/tvm/backend/tvmcg.py +102 -0
- mlonmcu/flow/tvm/backend/tvmllvm.py +106 -0
- mlonmcu/flow/tvm/backend/tvmrt.py +151 -0
- mlonmcu/flow/tvm/backend/wrapper.py +645 -0
- mlonmcu/flow/tvm/framework.py +96 -0
- mlonmcu/logging.py +79 -0
- mlonmcu/mlonmcu.py +19 -0
- mlonmcu/models/__init__.py +31 -0
- mlonmcu/models/convert_data.py +107 -0
- mlonmcu/models/frontend.py +571 -0
- mlonmcu/models/group.py +29 -0
- mlonmcu/models/lookup.py +345 -0
- mlonmcu/models/metadata.py +133 -0
- mlonmcu/models/model.py +104 -0
- mlonmcu/models/options.py +64 -0
- mlonmcu/models/utils.py +136 -0
- mlonmcu/platform/__init__.py +27 -0
- mlonmcu/platform/_platform.py +46 -0
- mlonmcu/platform/espidf/__init__.py +25 -0
- mlonmcu/platform/espidf/espidf.py +489 -0
- mlonmcu/platform/espidf/espidf_target.py +257 -0
- mlonmcu/platform/lookup.py +126 -0
- mlonmcu/platform/microtvm/__init__.py +25 -0
- mlonmcu/platform/microtvm/microtvm.py +580 -0
- mlonmcu/platform/microtvm/microtvm_arduino_target.py +68 -0
- mlonmcu/platform/microtvm/microtvm_backend.py +64 -0
- mlonmcu/platform/microtvm/microtvm_espidf_target.py +94 -0
- mlonmcu/platform/microtvm/microtvm_etissvp_target.py +98 -0
- mlonmcu/platform/microtvm/microtvm_host_target.py +46 -0
- mlonmcu/platform/microtvm/microtvm_spike_target.py +230 -0
- mlonmcu/platform/microtvm/microtvm_target.py +189 -0
- mlonmcu/platform/microtvm/microtvm_template_target.py +55 -0
- mlonmcu/platform/microtvm/microtvm_zephyr_target.py +91 -0
- mlonmcu/platform/mlif/__init__.py +25 -0
- mlonmcu/platform/mlif/mlif.py +300 -0
- mlonmcu/platform/mlif/mlif_target.py +86 -0
- mlonmcu/platform/platform.py +244 -0
- mlonmcu/platform/tvm/__init__.py +25 -0
- mlonmcu/platform/tvm/tvm.py +429 -0
- mlonmcu/platform/tvm/tvm_backend.py +57 -0
- mlonmcu/platform/tvm/tvm_target.py +165 -0
- mlonmcu/platform/zephyr/__init__.py +25 -0
- mlonmcu/platform/zephyr/zephyr.py +450 -0
- mlonmcu/platform/zephyr/zephyr_target.py +110 -0
- mlonmcu/plugins.py +26 -0
- mlonmcu/report.py +99 -0
- mlonmcu/session/__init__.py +18 -0
- mlonmcu/session/postprocess/__init__.py +43 -0
- mlonmcu/session/postprocess/postprocess.py +62 -0
- mlonmcu/session/postprocess/postprocesses.py +487 -0
- mlonmcu/session/run.py +1008 -0
- mlonmcu/session/session.py +373 -0
- mlonmcu/setup/__init__.py +18 -0
- mlonmcu/setup/cache.py +147 -0
- mlonmcu/setup/gen_requirements.py +619 -0
- mlonmcu/setup/setup.py +285 -0
- mlonmcu/setup/task.py +380 -0
- mlonmcu/setup/tasks/__init__.py +40 -0
- mlonmcu/setup/tasks/arm_gcc.py +58 -0
- mlonmcu/setup/tasks/cmsisnn.py +151 -0
- mlonmcu/setup/tasks/common.py +36 -0
- mlonmcu/setup/tasks/corstone300.py +64 -0
- mlonmcu/setup/tasks/espidf.py +87 -0
- mlonmcu/setup/tasks/etiss.py +147 -0
- mlonmcu/setup/tasks/llvm.py +67 -0
- mlonmcu/setup/tasks/mlif.py +49 -0
- mlonmcu/setup/tasks/muriscvnn.py +166 -0
- mlonmcu/setup/tasks/pulp.py +192 -0
- mlonmcu/setup/tasks/riscv_gcc.py +146 -0
- mlonmcu/setup/tasks/spike.py +190 -0
- mlonmcu/setup/tasks/tf.py +92 -0
- mlonmcu/setup/tasks/tflite.py +59 -0
- mlonmcu/setup/tasks/tflmc.py +141 -0
- mlonmcu/setup/tasks/tvm.py +172 -0
- mlonmcu/setup/tasks/utvmcg.py +96 -0
- mlonmcu/setup/tasks/zephyr.py +119 -0
- mlonmcu/setup/utils.py +374 -0
- mlonmcu/target/__init__.py +37 -0
- mlonmcu/target/_target.py +41 -0
- mlonmcu/target/arm/__init__.py +3 -0
- mlonmcu/target/arm/corstone300.py +235 -0
- mlonmcu/target/arm/util.py +109 -0
- mlonmcu/target/common.py +194 -0
- mlonmcu/target/elf.py +256 -0
- mlonmcu/target/host_x86.py +84 -0
- mlonmcu/target/metrics.py +75 -0
- mlonmcu/target/riscv/__init__.py +7 -0
- mlonmcu/target/riscv/etiss_pulpino.py +462 -0
- mlonmcu/target/riscv/gvsoc_pulp.py +215 -0
- mlonmcu/target/riscv/ovpsim.py +301 -0
- mlonmcu/target/riscv/riscv.py +185 -0
- mlonmcu/target/riscv/riscv_qemu.py +166 -0
- mlonmcu/target/riscv/spike.py +243 -0
- mlonmcu/target/riscv/util.py +134 -0
- mlonmcu/target/target.py +200 -0
- mlonmcu/utils.py +49 -0
- mlonmcu/version.py +21 -0
- mlonmcu-0.3.0.dev0.dist-info/LICENSE +202 -0
- mlonmcu-0.3.0.dev0.dist-info/METADATA +343 -0
- mlonmcu-0.3.0.dev0.dist-info/NOTICE +8 -0
- mlonmcu-0.3.0.dev0.dist-info/RECORD +376 -0
- mlonmcu-0.3.0.dev0.dist-info/WHEEL +5 -0
- mlonmcu-0.3.0.dev0.dist-info/entry_points.txt +3 -0
- mlonmcu-0.3.0.dev0.dist-info/top_level.txt +1 -0
- resources/frameworks/tvm/crt_config/README.md +7 -0
- resources/frameworks/tvm/crt_config/crt_config.h +53 -0
- resources/frameworks/tvm/tuning_records/riscv_cpu_v0.01.log.best +46 -0
- resources/patches/fix_esp32c3_march.patch +20 -0
- resources/patches/pulp_freertos_support.patch +55 -0
- resources/platforms/espidf/micro_speech_esp32devboard/CMakeLists.txt +29 -0
- resources/platforms/espidf/micro_speech_esp32devboard/README.md +70 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/CMakeLists.txt +78 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/Kconfig +76 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/default_data.c +26 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/default_model_support/process_input.c +35 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/default_model_support/process_output.c +45 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/include/exit.h +26 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/include/ml_interface.h +70 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/include/printing.h +31 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/ml_interface.c +74 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/ml_interface_tflm.cc +64 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/ml_interface_tvm.c +53 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/tflite-lib/CMakeLists.txt +140 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/tflite-lib/Kconfig +8 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/tvm-lib/CMakeLists.txt +66 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/tvm-lib/Kconfig +7 -0
- resources/platforms/espidf/micro_speech_esp32devboard/example_test.py +38 -0
- resources/platforms/espidf/micro_speech_esp32devboard/info.txt +9 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/CMakeLists.txt +58 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/audio_provider.cc +193 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/audio_provider.h +49 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/command_responder.cc +53 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/command_responder.h +35 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/feature_provider.cc +132 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/feature_provider.cc.orig +145 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/feature_provider.h +55 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/COPYING +11 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/_kiss_fft_guts.h +168 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/kiss_fft.c +408 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/kiss_fft.h +124 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/tools/kiss_fftr.c +159 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/tools/kiss_fftr.h +46 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/main.cc +63 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/main_functions.cc +204 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/main_functions.h +37 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/micro_features_generator.cc +121 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/micro_features_generator.h +38 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/micro_model_settings.cc +23 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/micro_model_settings.h +43 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/bits.h +102 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft.cc +52 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft.h +50 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft_util.cc +69 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft_util.h +34 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank.c +134 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank.h +63 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank_util.c +220 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank_util.h +50 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend.c +72 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend.h +64 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend_util.c +85 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend_util.h +52 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/kiss_fft_common.h +48 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/kiss_fft_int16.cc +8 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/kiss_fft_int16.h +34 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_lut.c +30 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_lut.h +40 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale.c +83 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale.h +39 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale_util.c +27 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale_util.h +45 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction.c +51 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction.h +46 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction_util.c +45 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction_util.h +50 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control.c +56 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control.h +47 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control_util.c +92 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control_util.h +57 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window.c +70 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window.h +49 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window_util.c +73 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window_util.h +45 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/pins.c +14 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/pins.h +30 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/recognize_commands.cc +150 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/recognize_commands.h +173 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/ringbuf.c +333 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/ringbuf.h +74 -0
- resources/platforms/espidf/micro_speech_esp32devboard/sdkconfig.defaults +36 -0
- resources/platforms/espidf/project/CMakeLists.txt +29 -0
- resources/platforms/espidf/project/README.md +70 -0
- resources/platforms/espidf/project/components/mlif/CMakeLists.txt +77 -0
- resources/platforms/espidf/project/components/mlif/Kconfig +76 -0
- resources/platforms/espidf/project/components/mlif/default_data.c +26 -0
- resources/platforms/espidf/project/components/mlif/default_model_support/process_input.c +35 -0
- resources/platforms/espidf/project/components/mlif/default_model_support/process_output.c +45 -0
- resources/platforms/espidf/project/components/mlif/include/exit.h +26 -0
- resources/platforms/espidf/project/components/mlif/include/ml_interface.h +60 -0
- resources/platforms/espidf/project/components/mlif/include/printing.h +31 -0
- resources/platforms/espidf/project/components/mlif/ml_interface.c +54 -0
- resources/platforms/espidf/project/components/mlif/ml_interface_tflm.cc +40 -0
- resources/platforms/espidf/project/components/mlif/ml_interface_tvm.c +40 -0
- resources/platforms/espidf/project/components/tflite-lib/CMakeLists.txt +142 -0
- resources/platforms/espidf/project/components/tflite-lib/Kconfig +8 -0
- resources/platforms/espidf/project/components/tvm-lib/CMakeLists.txt +66 -0
- resources/platforms/espidf/project/components/tvm-lib/Kconfig +7 -0
- resources/platforms/espidf/project/example_test.py +38 -0
- resources/platforms/espidf/project/main/CMakeLists.txt +25 -0
- resources/platforms/espidf/project/main/main.c +57 -0
- resources/platforms/espidf/project/sdkconfig.defaults +26 -0
- resources/platforms/zephyr/project/CMakeLists.txt +22 -0
- resources/platforms/zephyr/project/Kconfig +101 -0
- resources/platforms/zephyr/project/README.rst +33 -0
- resources/platforms/zephyr/project/cmake/AddAllSubdirs.cmake +21 -0
- resources/platforms/zephyr/project/cmake/ChooseTarget.cmake +22 -0
- resources/platforms/zephyr/project/cmake/LinkTFLite.cmake +223 -0
- resources/platforms/zephyr/project/cmake/LinkTVM.cmake +68 -0
- resources/platforms/zephyr/project/cmake/LookupClang.cmake +41 -0
- resources/platforms/zephyr/project/cmake/backends/tflmc.cmake +5 -0
- resources/platforms/zephyr/project/cmake/backends/tflmi.cmake +5 -0
- resources/platforms/zephyr/project/cmake/backends/tvmaot.cmake +10 -0
- resources/platforms/zephyr/project/cmake/backends/tvmaotplus.cmake +10 -0
- resources/platforms/zephyr/project/cmake/backends/tvmcg.cmake +10 -0
- resources/platforms/zephyr/project/cmake/backends/tvmllvm.cmake +8 -0
- resources/platforms/zephyr/project/cmake/backends/tvmrt.cmake +8 -0
- resources/platforms/zephyr/project/cmake/extras.cmake +9 -0
- resources/platforms/zephyr/project/cmake/features/auto_vectorize_gcc.cmake +65 -0
- resources/platforms/zephyr/project/cmake/features/auto_vectorize_llvm.cmake +20 -0
- resources/platforms/zephyr/project/cmake/features/cmsisnn.cmake +86 -0
- resources/platforms/zephyr/project/cmake/features/muriscvnn.cmake +87 -0
- resources/platforms/zephyr/project/cmake/frameworks/tflm.cmake +1 -0
- resources/platforms/zephyr/project/cmake/frameworks/tflm_mlif.cmake +8 -0
- resources/platforms/zephyr/project/cmake/frameworks/tvm.cmake +1 -0
- resources/platforms/zephyr/project/cmake/frameworks/tvm_mlif.cmake +37 -0
- resources/platforms/zephyr/project/lib/CMakeLists.txt +13 -0
- resources/platforms/zephyr/project/lib/drivers/fake_input.c +10 -0
- resources/platforms/zephyr/project/lib/drivers/fake_input.h +8 -0
- resources/platforms/zephyr/project/lib/ml_interface/CMakeLists.txt +31 -0
- resources/platforms/zephyr/project/lib/ml_interface/default_data.c +8 -0
- resources/platforms/zephyr/project/lib/ml_interface/default_model_support/CMakeLists.txt +2 -0
- resources/platforms/zephyr/project/lib/ml_interface/default_model_support/process_input.c +17 -0
- resources/platforms/zephyr/project/lib/ml_interface/default_model_support/process_output.c +27 -0
- resources/platforms/zephyr/project/lib/ml_interface/ml_interface.c +36 -0
- resources/platforms/zephyr/project/lib/ml_interface/ml_interface.h +47 -0
- resources/platforms/zephyr/project/lib/ml_interface/ml_interface_tflm.cc +22 -0
- resources/platforms/zephyr/project/lib/ml_interface/ml_interface_tvm.c +22 -0
- resources/platforms/zephyr/project/lib/support/CMakeLists.txt +2 -0
- resources/platforms/zephyr/project/lib/support/dummy.c +0 -0
- resources/platforms/zephyr/project/lib/support/exit.h +8 -0
- resources/platforms/zephyr/project/lib/support/printing.h +11 -0
- resources/platforms/zephyr/project/lib/support/quantize.h +23 -0
- resources/platforms/zephyr/project/lib/targets/corstone300.c +62 -0
- resources/platforms/zephyr/project/lib/targets/default.c +2 -0
- resources/platforms/zephyr/project/lib/targets/etiss_pulpino.c +112 -0
- resources/platforms/zephyr/project/lib/targets/generic_riscv.c +112 -0
- resources/platforms/zephyr/project/lib/targets/riscv_qemu.c +112 -0
- resources/platforms/zephyr/project/lib/targets/target.h +2 -0
- resources/platforms/zephyr/project/prj.conf +11 -0
- resources/platforms/zephyr/project/sample.yaml +19 -0
- resources/platforms/zephyr/project/src/main.c +71 -0
- resources/platforms/zephyr/project2/CMakeLists.txt +72 -0
- resources/platforms/zephyr/project2/Kconfig +101 -0
- resources/platforms/zephyr/project2/README.rst +33 -0
- resources/platforms/zephyr/project2/cmake/AddAllSubdirs.cmake +21 -0
- resources/platforms/zephyr/project2/cmake/ChooseTarget.cmake +22 -0
- resources/platforms/zephyr/project2/cmake/LinkTFLite.cmake +223 -0
- resources/platforms/zephyr/project2/cmake/LinkTVM.cmake +68 -0
- resources/platforms/zephyr/project2/cmake/LookupClang.cmake +41 -0
- resources/platforms/zephyr/project2/cmake/backends/tflmc.cmake +5 -0
- resources/platforms/zephyr/project2/cmake/backends/tflmi.cmake +5 -0
- resources/platforms/zephyr/project2/cmake/backends/tvmaot.cmake +10 -0
- resources/platforms/zephyr/project2/cmake/backends/tvmaotplus.cmake +10 -0
- resources/platforms/zephyr/project2/cmake/backends/tvmcg.cmake +10 -0
- resources/platforms/zephyr/project2/cmake/backends/tvmllvm.cmake +8 -0
- resources/platforms/zephyr/project2/cmake/backends/tvmrt.cmake +8 -0
- resources/platforms/zephyr/project2/cmake/extras.cmake +9 -0
- resources/platforms/zephyr/project2/cmake/features/auto_vectorize_gcc.cmake +65 -0
- resources/platforms/zephyr/project2/cmake/features/auto_vectorize_llvm.cmake +20 -0
- resources/platforms/zephyr/project2/cmake/features/cmsisnn.cmake +86 -0
- resources/platforms/zephyr/project2/cmake/features/muriscvnn.cmake +87 -0
- resources/platforms/zephyr/project2/cmake/frameworks/tflm.cmake +1 -0
- resources/platforms/zephyr/project2/cmake/frameworks/tflm_mlif.cmake +8 -0
- resources/platforms/zephyr/project2/cmake/frameworks/tvm.cmake +1 -0
- resources/platforms/zephyr/project2/cmake/frameworks/tvm_mlif.cmake +37 -0
- resources/platforms/zephyr/project2/default_data.c +8 -0
- resources/platforms/zephyr/project2/default_model_support/CMakeLists.txt +3 -0
- resources/platforms/zephyr/project2/default_model_support/process_input.c +17 -0
- resources/platforms/zephyr/project2/default_model_support/process_output.c +27 -0
- resources/platforms/zephyr/project2/lib/CMakeLists.txt +13 -0
- resources/platforms/zephyr/project2/lib/drivers/fake_input.c +10 -0
- resources/platforms/zephyr/project2/lib/drivers/fake_input.h +8 -0
- resources/platforms/zephyr/project2/lib/support/CMakeLists.txt +2 -0
- resources/platforms/zephyr/project2/lib/support/dummy.c +0 -0
- resources/platforms/zephyr/project2/lib/support/exit.h +8 -0
- resources/platforms/zephyr/project2/lib/support/printing.h +11 -0
- resources/platforms/zephyr/project2/lib/support/quantize.h +23 -0
- resources/platforms/zephyr/project2/lib/targets/corstone300.c +62 -0
- resources/platforms/zephyr/project2/lib/targets/default.c +2 -0
- resources/platforms/zephyr/project2/lib/targets/etiss_pulpino.c +112 -0
- resources/platforms/zephyr/project2/lib/targets/generic_riscv.c +112 -0
- resources/platforms/zephyr/project2/lib/targets/riscv_qemu.c +112 -0
- resources/platforms/zephyr/project2/lib/targets/target.h +2 -0
- resources/platforms/zephyr/project2/ml_interface.c +36 -0
- resources/platforms/zephyr/project2/ml_interface.h +47 -0
- resources/platforms/zephyr/project2/ml_interface_tflm.cc +22 -0
- resources/platforms/zephyr/project2/ml_interface_tvm.c +22 -0
- resources/platforms/zephyr/project2/prj.conf +13 -0
- resources/platforms/zephyr/project2/sample.yaml +19 -0
- resources/platforms/zephyr/project2/settings.json +6 -0
- resources/platforms/zephyr/project2/src/main.c +35 -0
- resources/pycharm/.run/README.md +73 -0
- resources/pycharm/.run/step1_ init env.run.xml +24 -0
- resources/pycharm/.run/step2_ setup.run.xml +25 -0
- resources/pycharm/.run/step3_ run resnet on pulpxpulpissimo.run.xml +25 -0
- resources/templates/default.yml.j2 +258 -0
- resources/templates/dev.yml.j2 +212 -0
- resources/templates/minimal.yml.j2 +234 -0
- resources/templates/phi.yml.j2 +282 -0
- resources/templates/pulp.yml.j2 +267 -0
- resources/templates/research.yml.j2 +237 -0
- resources/templates/tumeda.yml.j2 +239 -0
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2022 TUM Department of Electrical and Computer Engineering.
|
|
3
|
+
#
|
|
4
|
+
# This file is part of MLonMCU.
|
|
5
|
+
# See https://github.com/tum-ei-eda/mlonmcu.git for further info.
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
"""TVM Platform"""
|
|
20
|
+
|
|
21
|
+
import tempfile
|
|
22
|
+
import concurrent
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
from mlonmcu.setup import utils
|
|
26
|
+
from mlonmcu.logging import get_logger
|
|
27
|
+
from mlonmcu.artifact import Artifact, ArtifactFormat
|
|
28
|
+
from mlonmcu.target import get_targets
|
|
29
|
+
from mlonmcu.target.target import Target
|
|
30
|
+
from mlonmcu.config import str2bool
|
|
31
|
+
from mlonmcu.flow.tvm.backend.tvmc_utils import (
|
|
32
|
+
get_bench_tvmc_args,
|
|
33
|
+
get_data_tvmc_args,
|
|
34
|
+
get_rpc_tvmc_args,
|
|
35
|
+
get_target_tvmc_args,
|
|
36
|
+
)
|
|
37
|
+
from mlonmcu.flow.tvm.backend.python_utils import prepare_python_environment
|
|
38
|
+
from mlonmcu.flow.tvm.backend.tuner import TVMTuner
|
|
39
|
+
|
|
40
|
+
from ..platform import TargetPlatform, BuildPlatform, TunePlatform
|
|
41
|
+
from .tvm_target import create_tvm_platform_target
|
|
42
|
+
from .tvm_backend import create_tvm_platform_backend, get_tvm_platform_backends
|
|
43
|
+
|
|
44
|
+
logger = get_logger()
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class TvmPlatform(BuildPlatform, TargetPlatform, TunePlatform):
|
|
48
|
+
"""TVM Platform class."""
|
|
49
|
+
|
|
50
|
+
FEATURES = TargetPlatform.FEATURES + ["benchmark", "tvm_rpc", "autotune", "tvm_profile"] # TODO: validate?
|
|
51
|
+
|
|
52
|
+
DEFAULTS = {
|
|
53
|
+
**TargetPlatform.DEFAULTS,
|
|
54
|
+
"project_template": None,
|
|
55
|
+
"project_dir": None,
|
|
56
|
+
"fill_mode": "random",
|
|
57
|
+
"ins_file": None,
|
|
58
|
+
"outs_file": None,
|
|
59
|
+
"print_top": False,
|
|
60
|
+
"profile": False,
|
|
61
|
+
"repeat": 1,
|
|
62
|
+
"number": 1,
|
|
63
|
+
"aggregate": "none", # Allowed: avg, max, min, none, all
|
|
64
|
+
"total_time": False,
|
|
65
|
+
"use_rpc": False,
|
|
66
|
+
"rpc_key": None,
|
|
67
|
+
"rpc_hostname": None,
|
|
68
|
+
"rpc_port": None,
|
|
69
|
+
"tvmc_extra_args": [],
|
|
70
|
+
"tvmc_custom_script": None,
|
|
71
|
+
"experimental_tvmc_tune_tasks": False,
|
|
72
|
+
"experimental_tvmc_tune_visualize": False,
|
|
73
|
+
**{("autotuning_" + key): value for key, value in TVMTuner.DEFAULTS.items()},
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
REQUIRED = ["tvm.build_dir", "tvm.pythonpath", "tvm.configs_dir"]
|
|
77
|
+
|
|
78
|
+
def __init__(self, features=None, config=None):
|
|
79
|
+
super().__init__(
|
|
80
|
+
"tvm", # Actually: tvmllvm
|
|
81
|
+
features=features,
|
|
82
|
+
config=config,
|
|
83
|
+
)
|
|
84
|
+
self.tempdir = None
|
|
85
|
+
self.project_name = "app"
|
|
86
|
+
self.project_dir = None
|
|
87
|
+
|
|
88
|
+
def create_backend(self, name):
|
|
89
|
+
supported = self.get_supported_backends()
|
|
90
|
+
assert name in supported, f"{name} is not a valid TVM platform backend"
|
|
91
|
+
base = supported[name]
|
|
92
|
+
return create_tvm_platform_backend(name, self, base=base)
|
|
93
|
+
|
|
94
|
+
@property
|
|
95
|
+
def fill_mode(self):
|
|
96
|
+
return self.config["fill_mode"]
|
|
97
|
+
|
|
98
|
+
@property
|
|
99
|
+
def ins_file(self):
|
|
100
|
+
return self.config["ins_file"]
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def outs_file(self):
|
|
104
|
+
return self.config["outs_file"]
|
|
105
|
+
|
|
106
|
+
@property
|
|
107
|
+
def print_top(self):
|
|
108
|
+
return self.config["print_top"]
|
|
109
|
+
|
|
110
|
+
@property
|
|
111
|
+
def profile(self):
|
|
112
|
+
value = self.config["profile"]
|
|
113
|
+
return str2bool(value) if not isinstance(value, (bool, int)) else value
|
|
114
|
+
|
|
115
|
+
@property
|
|
116
|
+
def repeat(self):
|
|
117
|
+
return self.config["repeat"]
|
|
118
|
+
|
|
119
|
+
@property
|
|
120
|
+
def number(self):
|
|
121
|
+
return self.config["number"]
|
|
122
|
+
|
|
123
|
+
@property
|
|
124
|
+
def aggregate(self):
|
|
125
|
+
value = self.config["aggregate"]
|
|
126
|
+
assert value in ["avg", "all", "max", "min", "none"]
|
|
127
|
+
return value
|
|
128
|
+
|
|
129
|
+
@property
|
|
130
|
+
def total_time(self):
|
|
131
|
+
value = self.config["total_time"]
|
|
132
|
+
return str2bool(value) if not isinstance(value, (bool, int)) else value
|
|
133
|
+
|
|
134
|
+
@property
|
|
135
|
+
def use_rpc(self):
|
|
136
|
+
value = self.config["use_rpc"]
|
|
137
|
+
return str2bool(value) if not isinstance(value, (bool, int)) else value
|
|
138
|
+
|
|
139
|
+
@property
|
|
140
|
+
def rpc_key(self):
|
|
141
|
+
return self.config["rpc_key"]
|
|
142
|
+
|
|
143
|
+
@property
|
|
144
|
+
def rpc_hostname(self):
|
|
145
|
+
return self.config["rpc_hostname"]
|
|
146
|
+
|
|
147
|
+
@property
|
|
148
|
+
def rpc_port(self):
|
|
149
|
+
return self.config["rpc_port"]
|
|
150
|
+
|
|
151
|
+
@property
|
|
152
|
+
def tvmc_extra_args(self):
|
|
153
|
+
return self.config["tvmc_extra_args"]
|
|
154
|
+
|
|
155
|
+
@property
|
|
156
|
+
def tvmc_custom_script(self):
|
|
157
|
+
return self.config["tvmc_custom_script"]
|
|
158
|
+
|
|
159
|
+
@property
|
|
160
|
+
def tvm_pythonpath(self):
|
|
161
|
+
return self.config["tvm.pythonpath"]
|
|
162
|
+
|
|
163
|
+
@property
|
|
164
|
+
def tvm_build_dir(self):
|
|
165
|
+
return self.config["tvm.build_dir"]
|
|
166
|
+
|
|
167
|
+
@property
|
|
168
|
+
def tvm_configs_dir(self):
|
|
169
|
+
return self.config["tvm.configs_dir"]
|
|
170
|
+
|
|
171
|
+
@property
|
|
172
|
+
def experimental_tvmc_tune_tasks(self):
|
|
173
|
+
value = self.config["experimental_tvmc_tune_tasks"]
|
|
174
|
+
return str2bool(value) if not isinstance(value, (bool, int)) else value
|
|
175
|
+
|
|
176
|
+
@property
|
|
177
|
+
def experimental_tvmc_tune_visualize(self):
|
|
178
|
+
value = self.config["experimental_tvmc_tune_visualize"]
|
|
179
|
+
return str2bool(value) if not isinstance(value, (bool, int)) else value
|
|
180
|
+
|
|
181
|
+
def init_directory(self, path=None, context=None):
|
|
182
|
+
if self.project_dir is not None:
|
|
183
|
+
self.project_dir.mkdir(exist_ok=True)
|
|
184
|
+
logger.debug("Project directory already initialized")
|
|
185
|
+
return
|
|
186
|
+
dir_name = self.name
|
|
187
|
+
if path is not None:
|
|
188
|
+
self.project_dir = Path(path)
|
|
189
|
+
elif self.config["project_dir"] is not None:
|
|
190
|
+
self.project_dir = Path(self.config["project_dir"])
|
|
191
|
+
else:
|
|
192
|
+
if context:
|
|
193
|
+
assert "temp" in context.environment.paths
|
|
194
|
+
self.project_dir = (
|
|
195
|
+
context.environment.paths["temp"].path / dir_name
|
|
196
|
+
) # TODO: Need to lock this for parallel builds
|
|
197
|
+
else:
|
|
198
|
+
logger.debug(
|
|
199
|
+
"Creating temporary directory because no context was available "
|
|
200
|
+
"and 'espidf.project_dir' was not supplied"
|
|
201
|
+
)
|
|
202
|
+
self.tempdir = tempfile.TemporaryDirectory()
|
|
203
|
+
self.project_dir = Path(self.tempdir.name) / dir_name
|
|
204
|
+
logger.debug("Temporary project directory: %s", self.project_dir)
|
|
205
|
+
self.project_dir.mkdir(exist_ok=True)
|
|
206
|
+
|
|
207
|
+
def get_supported_backends(self):
|
|
208
|
+
backend_names = get_tvm_platform_backends()
|
|
209
|
+
return backend_names
|
|
210
|
+
|
|
211
|
+
def get_supported_targets(self):
|
|
212
|
+
# TODO: get this via tvmc run --help
|
|
213
|
+
target_names = ["cpu", "cuda", "cl", "metal", "vulkan", "rocm", "micro"]
|
|
214
|
+
|
|
215
|
+
skip_names = ["micro"] # Use microtvm platform instead
|
|
216
|
+
|
|
217
|
+
return [f"tvm_{name}" for name in target_names if name not in skip_names]
|
|
218
|
+
|
|
219
|
+
def create_target(self, name):
|
|
220
|
+
assert name in self.get_supported_targets(), f"{name} is not a valid TVM device"
|
|
221
|
+
targets = get_targets()
|
|
222
|
+
if name in targets:
|
|
223
|
+
base = targets[name]
|
|
224
|
+
else:
|
|
225
|
+
base = Target
|
|
226
|
+
return create_tvm_platform_target(name, self, base=base)
|
|
227
|
+
|
|
228
|
+
def close(self):
|
|
229
|
+
if self.tempdir:
|
|
230
|
+
self.tempdir.cleanup()
|
|
231
|
+
|
|
232
|
+
def get_tvmc_run_args(self, path, device):
|
|
233
|
+
return [
|
|
234
|
+
path,
|
|
235
|
+
*["--device", device],
|
|
236
|
+
*get_data_tvmc_args(
|
|
237
|
+
mode=self.fill_mode, ins_file=self.ins_file, outs_file=self.outs_file, print_top=self.print_top
|
|
238
|
+
),
|
|
239
|
+
*get_bench_tvmc_args(
|
|
240
|
+
print_time=True, profile=self.profile, end_to_end=False, repeat=self.repeat, number=self.number
|
|
241
|
+
),
|
|
242
|
+
*get_rpc_tvmc_args(self.use_rpc, self.rpc_key, self.rpc_hostname, self.rpc_port),
|
|
243
|
+
]
|
|
244
|
+
|
|
245
|
+
def invoke_tvmc(self, command, *args):
|
|
246
|
+
env = prepare_python_environment(self.tvm_pythonpath, self.tvm_build_dir, self.tvm_configs_dir)
|
|
247
|
+
if self.tvmc_custom_script is None:
|
|
248
|
+
pre = ["-m", "tvm.driver.tvmc"]
|
|
249
|
+
else:
|
|
250
|
+
pre = [self.tvmc_custom_script]
|
|
251
|
+
return utils.python(*pre, command, *args, live=self.print_outputs, print_output=False, env=env)
|
|
252
|
+
|
|
253
|
+
def invoke_tvmc_run(self, path, device):
|
|
254
|
+
args = self.get_tvmc_run_args(path, device)
|
|
255
|
+
return self.invoke_tvmc("run", *args)
|
|
256
|
+
|
|
257
|
+
def run(self, elf, target, timeout=120):
|
|
258
|
+
# TODO: implement timeout
|
|
259
|
+
# Here, elf is actually a directory
|
|
260
|
+
# TODO: replace workaround with possibility to pass TAR directly
|
|
261
|
+
tar_path = elf
|
|
262
|
+
output = self.invoke_tvmc_run(str(tar_path), target.device)
|
|
263
|
+
|
|
264
|
+
return output
|
|
265
|
+
|
|
266
|
+
def get_tune_args(self, model, backend, out):
|
|
267
|
+
tuner = self.config.get("autotuning_tuner", "ga")
|
|
268
|
+
assert tuner in ["ga", "gridsearch", "random", "xgb", "xgb_knob", "xgb-rank"]
|
|
269
|
+
trials = self.config.get("autotuning_trials", 10)
|
|
270
|
+
mode = self.config.get("autotuning_mode", "autotvm")
|
|
271
|
+
assert mode in ["autotvm", "auto_scheduler"]
|
|
272
|
+
if not isinstance(trials, int):
|
|
273
|
+
trials = int(trials)
|
|
274
|
+
early_stopping = self.config.get("autotuning_early_stopping", None)
|
|
275
|
+
if early_stopping is None:
|
|
276
|
+
early_stopping = max(trials, 10) # Let's see if this default works out...
|
|
277
|
+
early_stopping = int(early_stopping)
|
|
278
|
+
max_parallel = int(self.config.get("autotuning_max_parallel", 1))
|
|
279
|
+
timeout = int(self.config.get("autotuning_timeout", 1000))
|
|
280
|
+
results_file = self.config.get("autotuning_results_file", None)
|
|
281
|
+
desired_layout = backend.config.get("desired_layout", None)
|
|
282
|
+
ret = [
|
|
283
|
+
*get_target_tvmc_args(
|
|
284
|
+
backend.target,
|
|
285
|
+
extra_target=backend.extra_target,
|
|
286
|
+
target_details=backend.get_target_details(),
|
|
287
|
+
),
|
|
288
|
+
*(["--desired-layout", desired_layout] if desired_layout is not None else []),
|
|
289
|
+
*get_rpc_tvmc_args(self.use_rpc, self.rpc_key, self.rpc_hostname, self.rpc_port),
|
|
290
|
+
# TODO: missing: pass config, disabled_pass, etc.
|
|
291
|
+
*["--tuner", tuner],
|
|
292
|
+
*(["--early-stopping", str(early_stopping)] if early_stopping > 0 else []),
|
|
293
|
+
*["--parallel", str(max_parallel)],
|
|
294
|
+
*["--timeout", str(timeout * max_parallel)],
|
|
295
|
+
*["--trials", str(trials)],
|
|
296
|
+
*["--number", str(self.number)], # TODO: increase while tuning?
|
|
297
|
+
*["--repeat", str(self.repeat)], # TODO: increase while tuning?
|
|
298
|
+
*(["--tuning-records", results_file] if results_file is not None else []),
|
|
299
|
+
*["--output", str(out)],
|
|
300
|
+
]
|
|
301
|
+
if self.config["autotuning_visualize"]:
|
|
302
|
+
assert (
|
|
303
|
+
self.experimental_tvmc_tune_tasks
|
|
304
|
+
), f"{self.name}.visualize_tuning requires experimental_autotvm_visualize"
|
|
305
|
+
ret.append("--visualize")
|
|
306
|
+
if self.config["autotuning_tasks"]:
|
|
307
|
+
assert self.experimental_tvmc_tune_tasks, f"{self.name}.tune_tasks requires experimental_tvmc_tune_tasks"
|
|
308
|
+
ret.extend(["--tasks", str(self.config["autotuning_tasks"])])
|
|
309
|
+
if mode == "auto_scheduler":
|
|
310
|
+
ret.append("--enable-autoscheduler")
|
|
311
|
+
ret.append(model)
|
|
312
|
+
return ret
|
|
313
|
+
|
|
314
|
+
def tune_model(self, model_path, backend, target):
|
|
315
|
+
enable = self.config["autotuning_enable"]
|
|
316
|
+
results_file = self.config["autotuning_results_file"]
|
|
317
|
+
append = self.config["autotuning_append"]
|
|
318
|
+
num_workers = int(self.config["autotuning_num_workers"])
|
|
319
|
+
artifacts = []
|
|
320
|
+
verbose = False
|
|
321
|
+
if self.print_outputs:
|
|
322
|
+
verbose = True
|
|
323
|
+
|
|
324
|
+
content = ""
|
|
325
|
+
if enable:
|
|
326
|
+
if append:
|
|
327
|
+
if results_file is not None:
|
|
328
|
+
with open(results_file, "r") as handle:
|
|
329
|
+
content = handle.read()
|
|
330
|
+
|
|
331
|
+
if num_workers > 1:
|
|
332
|
+
assert self.experimental_tvmc_tune_tasks, "num_workers>1 requires experimental_tvmc_tune_tasks=1"
|
|
333
|
+
# TODO: fix
|
|
334
|
+
assert self.config["autotuning_tasks"] is None, "tune_tasks not supported together with num_workers > 1"
|
|
335
|
+
|
|
336
|
+
def get_tune_tasks():
|
|
337
|
+
with tempfile.TemporaryDirectory() as tmp_dir:
|
|
338
|
+
out_file = Path(tmp_dir) / "tuning_results.log.txt"
|
|
339
|
+
tune_args = self.get_tune_args(model_path, backend, out_file)
|
|
340
|
+
out = self.invoke_tvmc("tune", *tune_args, "--task", "list")
|
|
341
|
+
lines = out.split("\n")
|
|
342
|
+
for i, line in enumerate(lines):
|
|
343
|
+
if "Available Tasks for tuning" in line:
|
|
344
|
+
lines = lines[i + 1 :]
|
|
345
|
+
break
|
|
346
|
+
tasks = [line.split(". ", 1)[1] for line in lines if len(line.strip()) > 0]
|
|
347
|
+
return tasks
|
|
348
|
+
|
|
349
|
+
num_tasks = len(get_tune_tasks())
|
|
350
|
+
workers = []
|
|
351
|
+
with concurrent.futures.ThreadPoolExecutor(num_workers) as executor:
|
|
352
|
+
for i in range(num_tasks):
|
|
353
|
+
print(f"Created worker for task {i}")
|
|
354
|
+
|
|
355
|
+
def do_work(idx, prepend):
|
|
356
|
+
with tempfile.TemporaryDirectory() as tmp_dir:
|
|
357
|
+
out_file = Path(tmp_dir) / "tuning_results.log.txt"
|
|
358
|
+
with open(out_file, "w") as handle:
|
|
359
|
+
handle.write(prepend)
|
|
360
|
+
tune_args = self.get_tune_args(model_path, backend, out_file)
|
|
361
|
+
out = self.invoke_tvmc("tune", *tune_args, "--task", str(idx))
|
|
362
|
+
with open(out_file, "r") as handle:
|
|
363
|
+
content = handle.read()
|
|
364
|
+
return (out, content)
|
|
365
|
+
|
|
366
|
+
workers.append(executor.submit(do_work, i, content))
|
|
367
|
+
all_out = ""
|
|
368
|
+
all_content = ""
|
|
369
|
+
for i, w in enumerate(workers):
|
|
370
|
+
print(f"Worker {i}: done")
|
|
371
|
+
ret = w.result()
|
|
372
|
+
out, content = ret
|
|
373
|
+
all_out += out
|
|
374
|
+
all_content += content
|
|
375
|
+
out = all_out
|
|
376
|
+
content = all_content
|
|
377
|
+
else:
|
|
378
|
+
with tempfile.TemporaryDirectory() as tmp_dir:
|
|
379
|
+
out_file = Path(tmp_dir) / "tuning_results.log.txt"
|
|
380
|
+
with open(out_file, "w") as handle:
|
|
381
|
+
handle.write(content)
|
|
382
|
+
tune_args = self.get_tune_args(model_path, backend, out_file)
|
|
383
|
+
out = self.invoke_tvmc("tune", *tune_args)
|
|
384
|
+
with open(out_file, "r") as handle:
|
|
385
|
+
content = handle.read()
|
|
386
|
+
else:
|
|
387
|
+
if results_file is None:
|
|
388
|
+
return []
|
|
389
|
+
assert Path(results_file).is_file()
|
|
390
|
+
with open(results_file, "r") as handle:
|
|
391
|
+
content = handle.read()
|
|
392
|
+
|
|
393
|
+
artifact = Artifact("tuning_results.log.txt", content=content, fmt=ArtifactFormat.TEXT)
|
|
394
|
+
artifacts.append(artifact)
|
|
395
|
+
|
|
396
|
+
# pick best records
|
|
397
|
+
def _pick_best(backend, records, verbose=False):
|
|
398
|
+
content_best = ""
|
|
399
|
+
with tempfile.TemporaryDirectory() as tmp_dir:
|
|
400
|
+
in_file = Path(tmp_dir) / "tuning_results.log.txt"
|
|
401
|
+
with open(in_file, "w") as handle:
|
|
402
|
+
handle.write(records)
|
|
403
|
+
out_file = Path(tmp_dir) / "best_tuning_results.log.txt"
|
|
404
|
+
args = [
|
|
405
|
+
"--mode",
|
|
406
|
+
"pick",
|
|
407
|
+
"--i",
|
|
408
|
+
in_file,
|
|
409
|
+
"--o",
|
|
410
|
+
out_file,
|
|
411
|
+
]
|
|
412
|
+
env = prepare_python_environment(backend.tvm_pythonpath, backend.tvm_build_dir, backend.tvm_configs_dir)
|
|
413
|
+
utils.python("-m", "tvm.autotvm.record", *args, live=verbose, env=env)
|
|
414
|
+
with open(out_file, "r") as handle:
|
|
415
|
+
content_best = handle.read()
|
|
416
|
+
return content_best
|
|
417
|
+
|
|
418
|
+
content_best = _pick_best(backend, content, verbose=verbose)
|
|
419
|
+
if len(content_best) > 0:
|
|
420
|
+
artifact_ = Artifact("best_tuning_results.log.txt", content=content_best, fmt=ArtifactFormat.TEXT)
|
|
421
|
+
artifacts.append(artifact_)
|
|
422
|
+
|
|
423
|
+
if enable:
|
|
424
|
+
stdout_artifact = Artifact(
|
|
425
|
+
"tvmc_tune_out.log", content=out, fmt=ArtifactFormat.TEXT
|
|
426
|
+
) # TODO: rename to tvmaot_out.log?
|
|
427
|
+
artifacts.append(stdout_artifact)
|
|
428
|
+
|
|
429
|
+
return artifacts
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2022 TUM Department of Electrical and Computer Engineering.
|
|
3
|
+
#
|
|
4
|
+
# This file is part of MLonMCU.
|
|
5
|
+
# See https://github.com/tum-ei-eda/mlonmcu.git for further info.
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
from mlonmcu.logging import get_logger
|
|
20
|
+
|
|
21
|
+
from mlonmcu.flow.tvm.backend.backend import TVMBackend
|
|
22
|
+
from mlonmcu.flow.tvm.backend.tvmllvm import TVMLLVMBackend
|
|
23
|
+
|
|
24
|
+
logger = get_logger()
|
|
25
|
+
|
|
26
|
+
TVM_PLATFORM_BACKEND_REGISTRY = {}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def register_tvm_platform_backend(backend_name, b, override=False):
|
|
30
|
+
global TVM_PLATFORM_BACKEND_REGISTRY
|
|
31
|
+
|
|
32
|
+
if backend_name in TVM_PLATFORM_BACKEND_REGISTRY and not override:
|
|
33
|
+
raise RuntimeError(f"TVM platform backend {backend_name} is already registered")
|
|
34
|
+
TVM_PLATFORM_BACKEND_REGISTRY[backend_name] = b
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def get_tvm_platform_backends():
|
|
38
|
+
return TVM_PLATFORM_BACKEND_REGISTRY
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
register_tvm_platform_backend("tvmllvm", TVMLLVMBackend)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def create_tvm_platform_backend(name, platform, base=TVMBackend):
|
|
45
|
+
class TvmPlatformBackend(base):
|
|
46
|
+
FEATURES = base.FEATURES + []
|
|
47
|
+
|
|
48
|
+
DEFAULTS = {
|
|
49
|
+
**base.DEFAULTS,
|
|
50
|
+
}
|
|
51
|
+
REQUIRED = base.REQUIRED + []
|
|
52
|
+
|
|
53
|
+
def __init__(self, features=None, config=None):
|
|
54
|
+
super().__init__(runtime="cpp", fmt="so", features=features, config=config)
|
|
55
|
+
self.platform = platform
|
|
56
|
+
|
|
57
|
+
return TvmPlatformBackend
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2022 TUM Department of Electrical and Computer Engineering.
|
|
3
|
+
#
|
|
4
|
+
# This file is part of MLonMCU.
|
|
5
|
+
# See https://github.com/tum-ei-eda/mlonmcu.git for further info.
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
import re
|
|
20
|
+
import os
|
|
21
|
+
|
|
22
|
+
from mlonmcu.target.target import Target
|
|
23
|
+
from mlonmcu.target.metrics import Metrics
|
|
24
|
+
|
|
25
|
+
from mlonmcu.logging import get_logger
|
|
26
|
+
|
|
27
|
+
logger = get_logger()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def name2device(name):
|
|
31
|
+
return name.replace("tvm_", "")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def create_tvm_platform_target(name, platform, base=Target):
|
|
35
|
+
class TvmPlatformTarget(base):
|
|
36
|
+
FEATURES = base.FEATURES + []
|
|
37
|
+
|
|
38
|
+
DEFAULTS = {
|
|
39
|
+
**base.DEFAULTS,
|
|
40
|
+
"timeout_sec": 0, # disabled
|
|
41
|
+
}
|
|
42
|
+
REQUIRED = base.REQUIRED + []
|
|
43
|
+
|
|
44
|
+
def __init__(self, features=None, config=None):
|
|
45
|
+
super().__init__(name=name, features=features, config=config)
|
|
46
|
+
self.platform = platform
|
|
47
|
+
self.device = name2device(name)
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def timeout_sec(self):
|
|
51
|
+
return int(self.config["timeout_sec"])
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def repeat(self):
|
|
55
|
+
return None # This is handled at the platform level
|
|
56
|
+
|
|
57
|
+
def exec(self, program, *args, cwd=os.getcwd(), **kwargs):
|
|
58
|
+
"""Use target to execute a executable with given arguments"""
|
|
59
|
+
if len(args) > 0:
|
|
60
|
+
raise RuntimeError("Program arguments are not supported for real hardware devices")
|
|
61
|
+
|
|
62
|
+
assert self.platform is not None, "TVM targets need a platform to execute programs"
|
|
63
|
+
|
|
64
|
+
if self.timeout_sec > 0:
|
|
65
|
+
raise NotImplementedError
|
|
66
|
+
|
|
67
|
+
ret = self.platform.run(program, self)
|
|
68
|
+
return ret
|
|
69
|
+
|
|
70
|
+
def parse_stdout(self, out):
|
|
71
|
+
mean_ms = None
|
|
72
|
+
median_ms = None
|
|
73
|
+
max_ms = None
|
|
74
|
+
min_ms = None
|
|
75
|
+
std_ms = None
|
|
76
|
+
found = False
|
|
77
|
+
for line in out.split("\n"):
|
|
78
|
+
if found:
|
|
79
|
+
match = re.compile(r"\s+(\d*\.\d+)\s+(\d*\.\d+)\s+(\d*\.\d+)\s+(\d*\.\d+)\s+(\d*\.\d+)").findall(
|
|
80
|
+
line
|
|
81
|
+
)
|
|
82
|
+
assert len(match) == 1
|
|
83
|
+
groups = match[0]
|
|
84
|
+
mean_ms, median_ms, max_ms, min_ms, std_ms = (
|
|
85
|
+
float(groups[0]),
|
|
86
|
+
float(groups[1]),
|
|
87
|
+
float(groups[2]),
|
|
88
|
+
float(groups[3]),
|
|
89
|
+
float(groups[4]),
|
|
90
|
+
)
|
|
91
|
+
break
|
|
92
|
+
if re.compile(r"\s+mean \(ms\)\s+median \(ms\)\s+max \(ms\)\s+min \(ms\)\s+std \(ms\)").match(line):
|
|
93
|
+
found = True
|
|
94
|
+
return mean_ms, median_ms, max_ms, min_ms, std_ms
|
|
95
|
+
|
|
96
|
+
def get_metrics(self, elf, directory, handle_exit=None):
|
|
97
|
+
if self.print_outputs:
|
|
98
|
+
out = self.exec(elf, cwd=directory, live=True, handle_exit=handle_exit)
|
|
99
|
+
else:
|
|
100
|
+
out = self.exec(
|
|
101
|
+
elf,
|
|
102
|
+
cwd=directory,
|
|
103
|
+
live=False,
|
|
104
|
+
print_func=lambda *args, **kwargs: None,
|
|
105
|
+
handle_exit=handle_exit,
|
|
106
|
+
)
|
|
107
|
+
mean_ms, _, max_ms, min_ms, _ = self.parse_stdout(out)
|
|
108
|
+
|
|
109
|
+
metrics = Metrics()
|
|
110
|
+
mean_s = mean_ms / 1e3 if mean_ms is not None else mean_ms
|
|
111
|
+
min_s = min_ms / 1e3 if min_ms is not None else min_ms
|
|
112
|
+
max_s = max_ms / 1e3 if max_ms is not None else max_ms
|
|
113
|
+
if (
|
|
114
|
+
self.platform.number == 1
|
|
115
|
+
and self.platform.repeat == 1
|
|
116
|
+
and (not self.platform.total_time or self.platform.aggregate != "none")
|
|
117
|
+
):
|
|
118
|
+
metrics.add("Runtime [s]", mean_s)
|
|
119
|
+
else:
|
|
120
|
+
if self.platform.total_time:
|
|
121
|
+
metrics.add("Total Runtime [s]", mean_s * self.platform.number)
|
|
122
|
+
if self.platform.aggregate == "all":
|
|
123
|
+
metrics.add("Average Runtime [s]", mean_s)
|
|
124
|
+
metrics.add("Min Runtime [s]", min_s)
|
|
125
|
+
metrics.add("Max Runtime [s]", max_s)
|
|
126
|
+
elif self.platform.aggregate in ["avg", "mean"]:
|
|
127
|
+
metrics.add("Average Runtime [s]", mean_s)
|
|
128
|
+
elif self.platform.aggregate == "min":
|
|
129
|
+
metrics.add("Min Runtime [s]", min_s)
|
|
130
|
+
elif self.platform.aggregate == "max":
|
|
131
|
+
metrics.add("Max Runtime [s]", max_s)
|
|
132
|
+
|
|
133
|
+
if self.platform.profile:
|
|
134
|
+
print("out", out)
|
|
135
|
+
headers = None
|
|
136
|
+
lines = out.split("\n")
|
|
137
|
+
extracted = []
|
|
138
|
+
|
|
139
|
+
def extract_cols(line):
|
|
140
|
+
x = re.compile(r"(([^\s\[\]]+)(\s\S+)*)(\[.*\])?").findall(line)
|
|
141
|
+
return [y[0] for y in x]
|
|
142
|
+
|
|
143
|
+
for line in lines:
|
|
144
|
+
if "---" in line:
|
|
145
|
+
break
|
|
146
|
+
if headers is None:
|
|
147
|
+
if "Name" in line:
|
|
148
|
+
headers = extract_cols(line)
|
|
149
|
+
else:
|
|
150
|
+
cols = extract_cols(line)
|
|
151
|
+
data = {headers[i]: val for i, val in enumerate(cols)}
|
|
152
|
+
extracted.append(data)
|
|
153
|
+
assert len(extracted) > 0
|
|
154
|
+
metrics = {"default": metrics}
|
|
155
|
+
for item in extracted:
|
|
156
|
+
metrics_ = Metrics()
|
|
157
|
+
metrics_.add("Runtime [s]", float(item["Duration (us)"]) / 1e6)
|
|
158
|
+
metrics[item["Name"]] = metrics_
|
|
159
|
+
|
|
160
|
+
return metrics, out, []
|
|
161
|
+
|
|
162
|
+
def get_arch(self):
|
|
163
|
+
return "unkwown"
|
|
164
|
+
|
|
165
|
+
return TvmPlatformTarget
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2022 TUM Department of Electrical and Computer Engineering.
|
|
3
|
+
#
|
|
4
|
+
# This file is part of MLonMCU.
|
|
5
|
+
# See https://github.com/tum-ei-eda/mlonmcu.git for further info.
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
"""MLonMCU Zephyr platform"""
|
|
20
|
+
|
|
21
|
+
# pylint: disable=wildcard-import, redefined-builtin
|
|
22
|
+
|
|
23
|
+
from .zephyr import ZephyrPlatform
|
|
24
|
+
|
|
25
|
+
__all__ = ["ZephyrPlatform"]
|