我正在尝试使用 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 服务器的情况下,会抛出此错误。
类似的问题可以在这里找到:运行时错误:无法缓存函数"__jaccard":没有可用于文件"/usr/local/lib/python3.7/site-packages/librosa/util/matching.py"的定位器
该问题是wsgi错误,似乎是由于导入librosa和numba造成的。这些天我一直被困住了。有关如何解决此问题的任何指示将不胜感激。
在花了几天时间敲打我的头之后,并阅读了我能用谷歌搜索的所有内容,我想通了。来了。
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 容器的根是只读挂载的。因此,缓存到库根目录的策略之一不是一种选择。
缓存目录本身并不默认为/tmp。最终,我通过 CloudFormation 模板中的NUMBA_CACHE_DIR: /tmp
显式设置了它,并且在本地调用时它测试成功,但是当我通过 ZIP 文件手动将其部署到 AWS 进行测试时,我忘记在控制台中再次设置它,它作为 None 进入应用程序,并失败。
一旦我在 lambda 控制台中指定了缓存目录 env var,它就起作用了。
各种帮助的来源
https://github.com/numba/numba/issues/5566
https://github.com/numba/numba/issues/4032
我只运行这个命令,它在我的情况下有效。
pip install librosa -U