首页 > 解决方案 > 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。这些天我一直被困住。任何有关如何解决此问题的指示都将受到高度赞赏。

标签: pythondjangoapachelibrosa

解决方案


在花了几天的时间来解决这个问题,并阅读了所有我能在谷歌上搜索的内容之后,我想通了。开始。

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

细节。 罪魁祸首是缓存目录的位置,以及在 numba 包中对应的这些目录缺少写权限,这是对librosa. Librosa 尝试使用numba装饰器缓存一些函数。Numba 有四个定位器类,它们通知要写入缓存的位置。

我认为 Numba 试图变得聪明,并根据用户指定的内容(例如专用缓存目录)以及系统中可用于写入缓存的内容来使用回退策略。结果,它通常可以工作,但如果不工作,似乎您指定了一个非常好的缓存位置,它会丢失或被回退策略覆盖,然后失败。

我注意到其中一些后备缓存位置策略包括尝试在库的根目录(在本例中为 librosa 的)内缓存,并缓存到/root/something...但我现在很确定,如果您设置NUMBA_CACHE_DIR正确,它会很好。

以下是我的具体案例:librosa在 AWS Lambda 中使用。帮助我的是在定位器类的各个位置添加调试打印输出numba/core/caching.py

我的用例:AWS Lambda

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

在我的例子中,它是 AWS Lambda,带有应用程序的 docker 容器的根以只读方式挂载。因此,缓存到库根目录的策略之一不是一种选择。

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

一旦我在 lambda 控制台中指定了缓存目录 env var,它就起作用了。

帮助的各种来源

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

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


推荐阅读