昇思MindSpore报错调试宝典(三):网络构建与训练类报错之语法问题

发布时间 2023-06-12 15:45:28作者: Skytier

上一期讲解了网络构建与训练类报错问题中context配置问题该如何定位解决,相信大家对网络构建与训练类的报错问题分析流程有所了解,那么本期我们看看网络构建与训练问题中的语法问题,它通常包括Python语法错误和MindSpore静态图语法错误,例如控制流语法不支持、Tensor切片错误等。那应该如何进行解决呢,本期以超出函数调用栈限制问题为例来讲解下定位解决的方法。

 

直接进入主题,请看具体案例~

%E6%8A%A5%E9%94%99%E5%AE%9D%E5%85%B8(%E4%B8%89)%E6%9C%9F-%E7%BD%91%E7%BB%9C%E6%9E%84%E5%BB%BA%E4%B8%8E%E8%AE%AD%E7%BB%83%E7%B1%BB%E6%8A%A5%E9%94%99%E4%B9%8B%E8%AF%AD%E6%B3%95%E9%97%AE%E9%A2%98.png

文字版:

小孢子:你好呀,昇思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:总结下语法问题定位方法,

  1. 查看报错提示重点信息,了解问题现象;
  2. 找到用户代码行if x > 0:;
  3. 分析控制流的两个分支的out数据类型,将其调整成相同类型。

嗯嗯,这么看只要找到问题的关键点,那问题自然迎刃而解啦!

小孢子:那太好了!掌握了分析问题方法,以后就能快速定位解决语法问题啦。

MindSpore:哈哈,对于语法问题如何定位解决,你掌握的很快啊!那么下次见面我们讲讲算子编译错误吧。

小孢子:好的!期待下次见面!

昇思MindSpore报错案例总结

【MindSpore报错解决地图】常见报错问题和解决方案:https://www.hiascend.com/forum/thread-0229108045633055169-1-1.html

 

往期内容:

昇思MindSpore报错调试宝典(一):数据加载与处理类

MindSpore报错调试宝典(二):网络构建与训练类报错之context配置问题