ESP32 与 Micropython:导入 python 文件时出现内存错误?

问题描述 投票:0回答:1

我目前正在开发一个项目,在使用 Micropython 运行的 ESP32 上运行机器学习模型。为了推断模型,我使用 SciKitLearn 库在 Python 中训练了随机森林分类模型。为了导出模型,我使用了 m2cgen 库,它将模型转换为纯 Python 代码。 生成的 python 文件大小约为 873 KB,如下所示:

def add_vectors(v1, v2):
    return [sum(i) for i in zip(v1, v2)]
def mul_vector_number(v1, num):
    return [i * num for i in v1]
def score(input):
    if input[31] <= 14182.0:
        if input[12] <= -7552.0:
            if input[43] <= -2098.0:
                if input[49] <= -2522.0:
                    if input[58] <= -4395.5:
                        if input[3] <= 4716.5:
                            if input[45] <= 4954.0:
                                if input[34] <= 1353.5:
                                    var0 = [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0]
                                else:
                                    var0 = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
                            else:
                                var0 = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
                        else:
                            var0 = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0]

[...]

return mul_vector_number(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(add_vectors(var46, var47), var48), var49), var50), var51), var52), var53), var54), var55), var56), var57), var58), var59), var60), var61), var62), var63), var64), var65), var66), var67), var68), var69), var70), var71), var72), var73), var74), var75), var76), var77), var78), var79), var80), var81), var82), var83), var84), var85), var86), var87), var88), var89), var90), var91), var92), var93), var94), var95), var96), var97), var98), var99), var100), 0.01)

然后我想将此文件存储在使用 MicroPython 进行闪存的 ESP32 微控制器上,以便推断模型。

将文件上传到ESP32的Flash时,一切正常。 (闪存大小约为 4 MB,其中 2 MB 可供用户使用)。然后我尝试导入 ESP32 上的 main.py 文件中的文件来使用分数功能。

from rf_model import score

但是,运行脚本时,程序抛出以下错误:

MemoryError: Memory allocation failed, allocating 136 bytes

任何有关如何解决此问题的帮助将不胜感激。

machine-learning out-of-memory esp32 micropython
1个回答
0
投票

您的脚本内存不足。闪存大小并不重要(尽管有 873 KB - 哇,那是巨大的),因为所有变量和其他运行时开销都分配在 RAM 中,而且内存不够。 ESP32 只有 520 KiB 的内部 RAM,其中只有 320 KiB 用于数据(其余用于在 RAM 中运行的代码)。 Python 解释器已经占用了其中的很大一部分,并且您的脚本将保留此后剩余的 RAM。简而言之 - 您不会做太多繁重的工作。 假设您当前的主板还没有外部 RAM,一个潜在的解决方案是购买一块具有尽可能多的外部 RAM 的主板。 Espressif 有

几个带有 8 MiB PSRAM 的开发套件

(价格差异为几欧元,所以我会购买其中最强大的 - ESP32-S3-DevKitC-1-N32R8V)。他们还销售相当笨重的 ESP32-S3-BOX-3,带有 16 MiB PSRAM - 这实际上是用于 AI 应用程序。 也许其中之一将为您的脚本提供足够的 RAM。显然,除非您能够预测脚本最坏情况下的 RAM 使用情况,否则无法保证。

© www.soinside.com 2019 - 2024. All rights reserved.