Удалите numba.lowering.LoweringError: Внутренняя ошибка

Я использую Numba, чтобы ускорить мой код, который работает нормально без Numba. Но после использования @jit происходит сбой с этой ошибкой:

Traceback (most recent call last):
  File "C:\work_asaaki\code\gbc_classifier_train_7.py", line 54, in <module>
    gentlebooster.train(X_train, y_train, boosting_rounds)
  File "C:\work_asaaki\code\gentleboost_c_class_jit_v7_nolimit.py", line 298, in train
    self.g_per_round, self.g = train_function(X, y, H)  
  File "C:\Anaconda\lib\site-packages\numba\dispatcher.py", line 152, in _compile_for_args
    return self.jit(sig)
  File "C:\Anaconda\lib\site-packages\numba\dispatcher.py", line 143, in jit
    return self.compile(sig, **kws)
  File "C:\Anaconda\lib\site-packages\numba\dispatcher.py", line 250, in compile
    locals=self.locals)
  File "C:\Anaconda\lib\site-packages\numba\compiler.py", line 183, in compile_bytecode
    flags.no_compile)
  File "C:\Anaconda\lib\site-packages\numba\compiler.py", line 323, in native_lowering_stage
    lower.lower()
  File "C:\Anaconda\lib\site-packages\numba\lowering.py", line 219, in lower
    self.lower_block(block)
  File "C:\Anaconda\lib\site-packages\numba\lowering.py", line 254, in lower_block
    raise LoweringError(msg, inst.loc)
numba.lowering.LoweringError: Internal error:
NotImplementedError: ('cast', <llvm.core.Instruction object at 0x000000001801D320>, slice3_type, int64)
File "gentleboost_c_class_jit_v7_nolimit.py", line 103

Линия 103 находится ниже, в цикле:

weights = np.empty([n,m])
for curr_n in range(n):
    weights[curr_n,:] = 1.0/(n) # this is line 103

где n константа уже определена где-то выше в моем коде.

Как я могу удалить ошибку? Какое "понижение" происходит? Я использую Anaconda 2.0.1 с Numba 0.13.x и Numpy 1.8.x на 64-битной машине.

1 ответ

Решение

На основании этого: https://gist.github.com/cc7768/bc5b8b7b9052708f0c0a,

Я понял, что делать, чтобы избежать проблемы. Вместо использования двоеточия : чтобы ссылаться на любую строку / столбец, я просто открыл цикл на два цикла, чтобы явно ссылаться на индексы в каждом измерении массива:

weights = np.empty([n,m])
for curr_n in range(n):
    for curr_m in range (m):
        weights[curr_n,curr_m] = 1.0/(n)

После этого в моем коде были другие случаи, когда я использовал двоеточие, но они не вызывали ошибок в дальнейшем, не знаю почему.

Другие вопросы по тегам