昇思MindSpore报错调试宝典(三):网络构建与训练类报错之语法问题
上一期讲解了网络构建与训练类报错问题中context配置问题该如何定位解决,相信大家对网络构建与训练类的报错问题分析流程有所了解,那么本期我们看看网络构建与训练问题中的语法问题,它通常包括Python语法错误和MindSpore静态图语法错误,例如控制流语法不支持、Tensor切片错误等。那应该如何进行解决呢,本期以超出函数调用栈限制问题为例来讲解下定位解决的方法。
直接进入主题,请看具体案例~
文字版:
小孢子:你好呀,昇思MindSpore!听了前面两期,已经学会如何分析一部分问题了,但有遇到了新问题,写的网络模型训练脚本执行失败,你快帮我分析看看是哪里出了问题?
MindSpore: 好呀!让我看看你的环境信息、脚本代码与报错日志~
小孢子:环境信息是这样的:
Hardware Environment: Ascend
Software Environment:
-- MindSpore version: 1.6.0
-- Python version: 3.7.6
-- OS platform and distribution: Ubuntu 4.15.0-74-generic
在控制流场景中,对同一个变量在不同分支不同类型的数据。代码如下:
01 import mindspore as ms
02 import mindspore.nn as nn
03 from mindspore import ms_function, context
04
05 context.set_context(mode=context.GRAPH_MODE)
06
07 def test_join():
08 class JoinNet(nn.Cell):
09 def construct(self, x):
10 out = [1, 2, 3]
11 if x > 0:
12 out = x
13 return out
14 x = ms.Tensor([1])
15 net = JoinNet()
16 res = net(x)
17 print("res:", res)
报错信息如下:
TypeError: mindspre/ccsrc/pipeline/jit/static_analysis/static_analysis.cc:780 ProcessEvalResults] Cannot join the return values of different branches,① perhaps you need to make them equal.
Type Join Failed: Abstract type AbstractTensor cannot join with AbstractList.
In file ../test.py(11)
if x > 0:②
MindSpore:我们一起看看问题分析过程,先看下报错信息,
①在TypeError中,写道Cannot join the return values of different branches,意思是不支持两个不同分支的join操作。
②查看条件语句的两个分支,out在true分支被赋值为Tensor类型,在false分支被赋值为list类型,条件x > y为变量,因此在return out语句中无法确定out的数据类型,会导致图模式下的编译出现异常。
解决办法,知道上面问题的原因是发生在out的数据类型上后,那就将out做出如下修改,
将代码中的out = [1, 2, 3],修改为out = Tensor([1, 2, 3])
最终完整代码如下:
01 import mindspore as ms
02 import mindspore.nn as nn
03 from mindspore import ms_function, context
04
05 context.set_context(mode=context.GRAPH_MODE)
06
07 def test_join():
08 class JoinNet(nn.Cell):
09 def construct(self, x):
10 out = Tensor([1, 2, 3])
11 if x > 0:
12 out = x
13 return out
14 x = ms.Tensor([1])
15 net = JoinNet()
16 res = net(x)
17 print("res:", res)
小孢子:好棒啊,执行成功了,输出结果: res: [1]
MindSpore:总结下语法问题定位方法,
- 查看报错提示重点信息,了解问题现象;
- 找到用户代码行if x > 0:;
- 分析控制流的两个分支的out数据类型,将其调整成相同类型。
嗯嗯,这么看只要找到问题的关键点,那问题自然迎刃而解啦!
小孢子:那太好了!掌握了分析问题方法,以后就能快速定位解决语法问题啦。
MindSpore:哈哈,对于语法问题如何定位解决,你掌握的很快啊!那么下次见面我们讲讲算子编译错误吧。
小孢子:好的!期待下次见面!
昇思MindSpore报错案例总结
【MindSpore报错解决地图】常见报错问题和解决方案:https://www.hiascend.com/forum/thread-0229108045633055169-1-1.html
往期内容: