RuntimeError at / cannot cache function '__shear_dense': no locator available for file '/home/...site-packages/librosa/util/utils.py'

RuntimeError at / cannot cache function '__shear_dense': no locator available for file '/home/...site-packages/librosa/util/utils.py'

我正在尝试使用 apache2 托管 django 应用程序。但是出现以下错误。

RuntimeError at / cannot cache function '__shear_dense': no locator available for file '/home/username/project/env/lib/python3.6/site-packages/librosa/util/utils.py'

当运行 Django 服务器时,不会遇到这样的错误,但在 apache2 服务器的情况下,会抛出此错误。

可以在这里找到类似的问题:RuntimeError: cannot cache function '__jaccard': no locator available for file '/usr/local/lib/python3.7/site-packages/librosa/util/matching.py'

问题是 wsgi 错误,似乎是由于导入了 librosa 和 numba。这些天我一直被困住了。任何有关如何解决此问题的指示都将受到高度赞赏。

我花了几天的时间来解决这个问题,并且尽我所能 google 阅读了这方面的内容,然后我想通了。开始了。

TL;DR: 确保将 NUMBA_CACHE_DIR 环境变量设置为您的应用程序可以写入的内容,并确保该变量实际传播到您的应用程序,您的应用程序会看到它。在某些环境中,这在本地测试中可能会出现,但在部署时可能会悄无声息地丢失。 真的,测试一下!这个建议我大概读了十几遍,我以为我检查了一切,我的问题在别处,但最后我错了。

详情。 罪魁祸首是缓存目录的位置,以及相应的numba包中对这些目录缺少写权限,这是对librosa的依赖。 Librosa 尝试使用 numba 装饰器来缓存一些函数。 Numba 有四个定位器 类,用于告知要写入缓存的位置。

我认为 Numba 试图变得聪明,并根据用户指定的内容(例如专用缓存目录)以及系统中可用于写入缓存的内容使用回退策略。因此,它通常有效,但当它无效时,可能看起来你指定了一个非常好的缓存位置,它丢失或被回退策略覆盖然后失败。

我注意到其中一些后备缓存位置策略包括尝试在库的根目录(在本例中为 librosa 的目录)中缓存,以及缓存到 /root/something... 但我现在很确定如果你设置对了NUMBA_CACHE_DIR就可以了

下面是我的具体案例:在 AWS Lambda 中使用 librosa。对我有帮助的是在 numba/core/caching.py

中定位器 类 的各个位置添加调试打印输出

我的用例:AWS Lambda

如果你得到这个,很可能你正在使用一些限制性环境,默认设置有些不寻常。

在我的例子中,它是 AWS Lambda,docker 容器的根安装了应用程序 read-only。因此,缓存到库根目录的策略之一不是一个选项。

缓存目录本身并没有默认为/tmp。最后,我通过 CloudFormation 模板中的 NUMBA_CACHE_DIR: /tmp 显式设置,并且在本地调用时测试成功,但是当我通过 ZIP 文件手动将其部署到 AWS 进行测试时,我忘记在控制台中再次设置它,并且它以 None 的身份访问应用程序,但失败了。

一旦我在 lambda 控制台中指定了缓存目录环境变量,它就起作用了。

提供帮助的各种来源

https://github.com/numba/numba/issues/5566

https://github.com/numba/numba/issues/4032