RuntimeError at / cannot cache function '__shear_dense': 没有可用于文件 '/home/...site-packages/librosa/util/utils.py' 的定位器

Aka*_*kar 4 python apache django librosa

我正在尝试使用 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'
Run Code Online (Sandbox Code Playgroud)

在运行 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。这些天我一直在坚持。任何有关如何解决此问题的指示都将受到高度赞赏。

Gen*_*sev 5

在花了几天的时间来反对这一点,并阅读了所有我可以在谷歌上搜索的内容后,我想通了。开始。

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: /tmpCloudFormation 模板显式设置了它,并且在本地调用时测试成功,但是当我通过 ZIP 文件手动将它部署到 AWS 进行测试时,我忘记在控制台中再次设置它,它来到应用程序没有,而且失败了。

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

有帮助的各种来源

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

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