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 服务器的情况下,会抛出这个错误。
问题是 wsgi 错误,似乎是由于导入了 librosa 和 numba。这些天我一直在坚持。任何有关如何解决此问题的指示都将受到高度赞赏。
在花了几天的时间来反对这一点,并阅读了所有我可以在谷歌上搜索的内容后,我想通了。开始。
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
| 归档时间: |
|
| 查看次数: |
1180 次 |
| 最近记录: |