小孢子的神奇之旅-如何阅读MindSpore报错信息(1)

MindSpore是什么?打开google翻译,得到如下的结果。

“心灵孢子”……有没有不明觉厉?刚看到这个名字的时候,让我想起了以前玩过的一个叫“Spore”的电脑游戏,玩家从一个孢子不断演化,建立文明,最后塑造整个世界。

 “心灵孢子”是不是也要塑造整个世界?继续研究“心灵孢子”到底是个啥?g家搜索,我们再来查查看。

MindSpore是端边云全场景按需协同的华为自研AI计算框架……”看到这个描述,不明觉厉again。“端边云全场景AI计算框架”这些技术热点关键词,让人有深入挖掘下去的冲动。经过一番研究,成功路转粉,与一群被叫做“小孢子”人耍在了一起。一个孢子的自我修养就是要不断分裂复制,今天开始就把应用MindSpore开发网络的一些经验分裂出来分享给大家。本孢子喜欢另辟蹊径,应用MindSpore开发网络的经验已经有很多人分享了,本孢子准备换个维度,给同学们一些不一样的东西。

因为AI框架的复杂度,在应用AI框架开发网络经常会遇到各种各样的问题,这些问题往往会成为小白同学的噩梦,搞个网络已经够复杂了,结果还报错,这不是要劝退的节奏。应用MindSpore也会遇到一些问题,这些问题是否也让同学抓耳挠腮呢?其实问题并不可怕,掌握了对的方法很容易征服它。为了挽救劝退边缘的同学,从此贴开始,本孢子会将在应用MindSpore过程中遇到的问题和解决方法逐一整理成系列案例分享给各位同学。

路要一步一步走,饭要一口一口吃。咱先来一个入门级的例子,与MindSpore的报错来个初见。

如下例子

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import mindspore
from mindspore import Tensor as Tensor
import mindspore.ops as ops
import numpy as np


input_x = Tensor(np.ones(shape=[3, 1, 2, 1]), mindspore.float32)
squeeze = ops.Squeeze([1,3])
output = squeeze(input_x)
print("input:", input_x)
print("output:", output)

接下来看到一堆的报错信息:

Traceback (most recent call last):
File "test_Squeeze.py", line 11, in <module>
squeeze = ops.Squeeze([1,3])
File "/root/anaconda3/envs/ljb171/lib/python3.7/site-packages/mindspore/ops/primitive.py", line 628, in deco
fn(self, *args, **kwargs)
File "/root/anaconda3/envs/ljb171/lib/python3.7/site-packages/mindspore/ops/operations/array_ops.py", line 693, in __init__
validator.check_value_type('axis', axis, [int, tuple], self.name)
File "/root/anaconda3/envs/ljb171/lib/python3.7/site-packages/mindspore/_checkparam.py", line 600, in check_value_type
raise_error_msg()
File "/root/anaconda3/envs/ljb171/lib/python3.7/site-packages/mindspore/_checkparam.py", line 591, in raise_error_msg
raise TypeError(f'{msg_prefix} type of `{arg_name}` should be {"one of " if num_types > 1 else ""}'
TypeError: For 'Squeeze', the type of `axis` should be one of ['int', 'tuple'], but got [1, 3] with type list.

报错的内容有点多,先莫慌,咱逐一分解到底MindSpore通过报错信息告诉了我们什么。熟悉python的同学应该看得出来,此问题的错误信息分为了两部分:1)python的堆栈信息 2)问题的描述信息。那我们读懂一个报错的顺序应该是先2)后1),即先阅读问题描述,再阅读堆栈信息。

第一步:阅读问题描述,理解问题原因。

TypeError: For 'Squeeze', the type of `axis` should be one of ['int', 'tuple'], but got [1, 3] with type list.

如上错误描述我们能获得哪些信息呢?TypeError 是这个错误的分类,表明这个错误是个类型相关的错误, 'Squeeze'我们可以知道是我们代码中调用的API,'axis' 又是什么?在MindSpore官网查询接口Squeeze,可知道'axis'是Squeeze的参数。

那整句话的含义就是API 'Squeeze'要求的参数'axis'的类型必须是int或者tuple, 但实际获得的值是[1, 3]也就是一个list,不符合入参类型是int或者tuple的要求,所以出问题了。

第二步:阅读堆栈信息,找到问题在哪里(具体的代码行)。

Traceback (most recent call last):
File "test_Squeeze.py", line 11, in <module>
squeeze = ops.Squeeze([1,3])
File "/root/anaconda3/envs/ljb171/lib/python3.7/site-packages/mindspore/ops/primitive.py", line 628, in deco
fn(self, *args, **kwargs)
File "/root/anaconda3/envs/ljb171/lib/python3.7/site-packages/mindspore/ops/operations/array_ops.py", line 693, in __init__
validator.check_value_type('axis', axis, [int, tuple], self.name)
File "/root/anaconda3/envs/ljb171/lib/python3.7/site-packages/mindspore/_checkparam.py", line 600, in check_value_type
raise_error_msg()
File "/root/anaconda3/envs/ljb171/lib/python3.7/site-packages/mindspore/_checkparam.py", line 591, in raise_error_msg
raise TypeError(f'{msg_prefix} type of `{arg_name}` should be {"one of " if num_types > 1 else ""}'

本例子的堆栈信息其实也比较简单,就是一个简单的python堆栈,即从问题的引入点到抛出错误的代码调用栈,代码test_Squeeze.py 的第11行(即ops.Squeeze([1,3]))就是我们的问题引入点,也就是我们要找的问题所在代码行,其他打印是MindSpore框架代码的调用栈信息。

第三步:解决问题,达到人生巅峰。

我们知道原因是参数类型不对,也知道是哪行代码传入的类型不对,解决问题就是顺水推舟的事情。将ops.Squeeze参数改为(1,3),问题就解决了。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import mindspore
from mindspore import Tensor as Tensor
import mindspore.ops as ops
import numpy as np


input_x = Tensor(np.ones(shape=[3, 1, 2, 1]), mindspore.float32)
squeeze = ops.Squeeze((1,3)) # 由list修改为元组
output = squeeze(input_x)
print("input:", input_x)
print("output:", output)

至此问题已经解决了,但可以稍稍深入,样例代码调用了MindSpore的ops接口,ops接口中的算子被称为Primitive算子,Primitive算子是开放给用户的最低阶算子接口,这些算子都继承于 primitive类,这也就是为什么异常的代码堆栈会有 primitive.py,Primitive算子使用前需要实例化,这个错误就是在做实例化时,传入的属性类型不对导致的异常,感兴趣的同学可以进一步看下MindSpore的框架代码。更多不同类型的算子说明,可参考官网的说明

算子分类 — MindSpore master documentation

试问达到人生巅峰要几步?共31)理解问题 2)找到问题在哪里 3)改了。回过头看下,别看字码的有点多,实际上解决这个问题是很容易的,本篇更多的是分享解决一个MindSpore问题的思路。因为本孢子属于拖延症晚期患者,为了抢救一下,前边立了flag说要做系列分享。如下列表,本篇先以Primitive算子问题开始,之后会根据不同类型的问题分享一些解决经验。

  • 算子问题

  • 静态图语法问题

  • 算子编译&选择问题

  • 模型保存与加载问题

  • 数据集处理问题

......(还没想清楚)

如果有同学也想为抢救拖延症患者出一份力,也可以把你想了解的问题抛给本孢子来分析解读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值