MindSpore论坛报错活动第四期---在静态图模式下使用try语法报错RuntimeError: Unsupported statement ‘Try‘.

1 系统环境

硬件环境(Ascend/GPU/CPU): CPU

MindSpore版本: 1.9.0

执行模式(动态图/静态图): 静态图

Python版本: 3.7

操作系统平台:linux

2 报错信息

2.1 报错信息

/root/miniconda3/envs/bin/python /mnt/d/06_project/trouble-shooter/tests/proposer/master/test_compiler_get_context.py
Traceback (most recent call last):
File "/mnt/d/06_project/trouble-shooter/troubleshooter/proposer/proposal_action.py", line 43, in proposal_wrapper
return func(*args, **kw)
File "/mnt/d/06_project/trouble-shooter/tests/proposer/master/test_compiler_get_context.py", line 93, in test2
out = net(input1, input2)
File "/root/miniconda3/envs/lib/python3.7/site-packages/mindspore/nn/cell.py", line 615, in __call__
out = self.compile_and_run(*args)
File "/root/miniconda3/envs/lib/python3.7/site-packages/mindspore/nn/cell.py", line 934, in compile_and_run
self.compile(*inputs)
File "/root/miniconda3/envs/lib/python3.7/site-packages/mindspore/nn/cell.py", line 908, in compile
jit_config_dict=self._jit_config_dict)
File "/root/miniconda3/envs/lib/python3.7/site-packages/mindspore/common/api.py", line 1363, in compile
result = self._graph_executor.compile(obj, args_list, phase, self._use_vm_mode())
RuntimeError: Unsupported statement 'Try'.
More details please refer to syntax support at https://www.mindspore.cn
----------------------------------------------------
- The Traceback of Net Construct Code:
----------------------------------------------------
# In file /root/miniconda3/envs/lib/python3.7/site-packages/mindspore/context.py:462
try:
----------------------------------------------------
- C++ Call Stack: (For framework developers)
----------------------------------------------------
mindspore/ccsrc/pipeline/jit/parse/parse.cc:774 ParseStatement复制

2.2 脚本代码

"""
This is a python code template
"""
import mindspore.context as context
import mindspore.nn as nn
from mindspore import Tensor
from mindspore.nn import Cell
from mindspore import ops
from mindspore import dtype as mstype
import mindspore

context.set_context(mode=mindspore.GRAPH_MODE, pynative_synchronize=False)

class Net1(nn.Cell):
def __init__(self):
super().__init__()
self.add = ops.Add()
self.sub = ops.Sub()
self.mul = ops.Mul()
self.div = ops.Div()

def func(x, y):
context.get_context("device_target")
return self.div(x, y)

def construct(self, x, y):
a = self.sub(x, 1)
b = self.add(a, y)
c = self.mul(b, self.func(a, b))
return c

def test2():
input1 = Tensor(3, mstype.float32)
input2 = Tensor(2, mstype.float32)
net = Net1()
out = net(input1, input2)
print(out)

if __name__ == '__main__':
test2()复制

3 根因分析

******此处由用户补充详细的定位过程******

根因

可能原因: 静态图模式下,网络的construct函数、@ms_function修饰的函数、@ms.jit修饰的函数中出现如下问题:

1)直接或者间接使用了try语法,此语法静态图模式不支持;

2)直接或间接的调用了MindSpore的get_context接口(get_context接口会使用try语法),此接口不能在construct等函数中调用;

补充说明:

此处是间接使用了try语法,mindspore静态图目前不支持try语法,可以参考官网静态图语法支持的链接:

静态图语法支持 — MindSpore master documentation 里面并没有try语句

而且为什么间接使用了try语法,是因为直接调用get_context接口,具体可以通过代码查看,

get_context接口调用了函数_context(),而_context()里面调用了try语法

image.png

image.png

get_context() 是在def func()被调用,def func()是在def construct()被调用

因此而报错

处理建议:

1)将try语法在函数中移除;

2)函数中调用的get_context()接口,迁移到函数外调用;

补充说明:

此处由于是间接调用try, 而且try是在mindspore代码里面的

不能修改mindspore代码删除try, 因此就把get_context()迁移到函数外使用即可

4 解决方案

******此处由用户填写******

最终方案:

2)函数中调用的get_context()接口,迁移到函数外调用;

代码:

"""
This is a python code template
"""
import mindspore.context as context
import mindspore.nn as nn
from mindspore import Tensor
from mindspore.nn import Cell
from mindspore import ops
from mindspore import dtype as mstype
import mindspore

context.set_context(mode=mindspore.GRAPH_MODE, pynative_synchronize=False)

class Net1(nn.Cell):
    def __init__(self):
        super().__init__()
        self.add = ops.Add()
        self.sub = ops.Sub()
        self.mul = ops.Mul()
        self.div = ops.Div()

    def func(x, y):
        #context.get_context("device_target")
        return self.div(x, y)

    def construct(self, x, y):
        a = self.sub(x, 1)
        b = self.add(a, y)
        c = self.mul(b, self.func(a, b))
        return c

def test2():
    context.get_context("device_target")
    input1 = Tensor(3, mstype.float32)
    input2 = Tensor(2, mstype.float32)
    net = Net1()
    out = net(input1, input2)
    print(out)

if __name__ == '__main__':
    test2()
复制

最终调试结果:

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值