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的相关操作。

posted @ 2022-07-17 17:26  Skytier  阅读(37)  评论(0编辑  收藏  举报