MindSpore 报错 Should not use Python in runtime
1 报错描述
1.1 系统环境
ardware Environment(Ascend/GPU/CPU): CPU
Software Environment:
– MindSpore version (source or binary): 1.7.0
– Python version (e.g., Python 3.7.5): 3.7.6
– OS platform and distribution (e.g., Linux Ubuntu 16.04): Ubuntu 4.15.0-74-generic
– GCC/Compiler version (if compiled from source):
1.2 基本信息
1.2.1脚本
此案例是使用MindSpore JIT Fallback 功能在mindspore中调用使用 Numpy的逻辑
import numpy as np
import mindspore.nn as nn
from mindspore import Tensor, ms_function, context
context.set_context(mode=context.GRAPH_MODE)
def test_validate():
@ms_function
def Func():
x = np.array([1])
if x >= 1:
x = x * 2
return x
res = Func()
print("res:", res)
1.2.2报错
RuntimeError: mindspore/ccsrc/pipeline/jit/validator.cc:141 ValidateValueNode] Should not use Python object in runtime, node: ValueNode<InterpretedObject> InterpretedObject: '[2]'.
Line: In file /home/llg/workspace/mindspore/mindspore/test.py(15)
E if x >= 1:
2 原因分析以及解决办法
这个是因为MindSpore 编译器在编译结束后进行校验时,发现了函数内部仍然还有一些解释类型的节点,导致的报错。查看代码后发现,函数返回了一个numpy类型的数据,这些数据并没有转换成MindSpore的Tensor导致无法进入后端运行时进行计算从而引发报错。可以将numpy array包装成Tensor后计算再将其返回。在函数外部利用Tensor.asnumpy()将其转换为numpy array类型数据,进行其他numpy的相关操作。
3 总结
MindSpore的函数是通过JIT Fallback的方式来实现函数对numpy类型操作的,这种方式只能在编译时刻完成推导和执行,不能传递到运行时。且不能作为最终的函数返回值返回,否则传递到运行时会引发报错。可以将numpy array包装成Tensor后将其返回。在函数外部利用Tensor.asnumpy()将其转换为numpy array类型数据,进行其他numpy的相关操作。