【问题标题】:Process finished with exit code -1073741819 (0xC0000005) with numba.jit使用 numba.jit 以退出代码 -1073741819 (0xC0000005) 完成的过程
【发布时间】:2021-12-09 22:30:02
【问题描述】:

我正在为一个在 WINDOWS 上使用 jit 编译的函数运行一个 python 脚本(下面描述的问题只出现在 WINDOWS 上,而不是在 LINUX 上运行时出现!)。 最小工作示例:

import numpy as np
from numba import jit

@jit(nopython=True)
def compute_loop(a, b, c):
    for i in range(a.shape[0]):
        for j in range(a.shape[1]):
            S0 = b[i, j]
            for k in range(1, 5):
                print('Entered last loop')
                if b[i + k, j + k] / S0 < 0.05:
                    c[i, j] = np.sum(S0 * b[i:i + k, j:j + k])
                    break
                if k == 4:
                    c[i, j] = np.sum(S0 * b[i:i + k, j:j + k])
    print('End')
    return c

def main():
    size_i = 261
    size_j = 510
    print(size_i*size_j)
    a = np.random.rand(size_i, size_j)
    b = np.random.rand(size_i, size_j)
    c = np.zeros((size_i, size_j))
    compute_loop(a, b, c)


if __name__ == '__main__':
    main()

当我使用size_i&gt;260 运行它时,脚本会以退出代码中断 Process finished with exit code -1073741819 (0xC0000005) 没有任何进一步的错误消息或回溯。退出发生在退出最后一个 for 循环之前,这意味着它将多次打印“Entered last for loop”,但最终只会产生退出代码而不会发出警告,也不会到达 return 语句(或者就此而言,打印命令“End”) .

size_i&lt;=260 或者当我使用没有 jit 的函数或者当我在 LINUX 上运行它时,代码运行良好!

所以它似乎取决于输入矩阵的矩阵大小,这是否有效。还是不明白怎么解决...

我尝试过的 Python 版本:

  • 3.7.5 在系统范围内安装,但在具有 numba 0.54.1 和 numpy 1.20.3 的虚拟环境中。
  • 3.7.7(在不同的 PC 上)具有用户安装和虚拟环境以及相同版本的 numba 和 numpy 无论哪种方式都会导致相同的退出代码,而不会出现错误/回溯。

我还尝试了什么:

  • 在调试/非调试模式下运行也没有区别。
  • 以管理员身份从 powershell 和 cmd 运行脚本,但它崩溃(在到达代码中的相同位置后)没有显示任何错误/退出代码。

以前的帖子: 我发现了一些具有相同退出代码的帖子,但没有一个与 numba 相关。到目前为止,我一无所知。有人有什么建议吗?

【问题讨论】:

  • 这可能是分段错误。 ''''some numpy array math (like np.sum) are called here" 部分中最重要的部分未共享,因此很难进一步帮助您。越界时经常会出现这样的问题。然而,代码似乎与 Numpy 一起工作的事实很奇怪。尽管如此,我们仍然需要一个可重现示例(尤其是如果它是 Numba 的错误)。
  • @JérômeRichard 好的。由于在不使用 numba 时代码运行良好,因此我假设故障不在循环内。但我又试了一次。根据您的建议,尽量减少。我相应地扩展了我的帖子。它似乎取决于每个矩阵具有的条目数。直到 132600 个条目(矩阵形状 260*510)代码才有效,但如果我使用 261*510(133110 个条目),我会再次得到相同的退出代码......

标签: python numba


【解决方案1】:

b[i + k, j + k] 上有一个越界。这在没有 Numba 的情况下是可见的。确实,Numpy(1.20.3 版)明确报告了错误:

IndexError: index 510 is out of bounds for axis 1 with size 510

Numba 假定索引有效,不报告此类错误,并且如果它们无效可能会崩溃(因为检查索引的成本很高)。请注意,您可以使用 assertions 自己检查索引(使用 assert)。

【讨论】:

  • 是的,你是对的。创建mwe时我的错误。我的非 numba 代码包含一个 try-except。 ''boundscheck=True' 在调试期间会更早地解决这个问题。为什么使用 numba 虽然只有在一定的矩阵大小之后才会导致错误,而在 Linux 下根本不会?
猜你喜欢
  • 2018-11-10
  • 2020-06-13
  • 1970-01-01
  • 2023-04-06
  • 2021-02-19
  • 2019-01-05
  • 2020-03-19
相关资源
最近更新 更多