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

MindSpore

是什么?

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
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 是Squeeze的参数。

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

第二步:阅读堆栈信息,找到问题在哪里。

Traceback (most recent call last):
File "test_Squeeze.py", line 11, in
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的框架代码。更多不同类型的算子说明,可参考官网的说明。

https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.5/operators_classification.html?highlight=primitive

总结

试问达到人生巅峰要几步?共3步: 

(1)理解问题;(2)找到问题在哪里;(3)修改问题。

回过头看下,别看字码的有点多,实际上解决这个问题是很容易的,本篇更多的是分享解决一个MindSpore问题的思路。如下列表,本篇先以Primitive算子问题开始,之后会根据不同类型的问题分享一些解决经验。

算子问题

静态图语法问题

算子编译&选择问题

模型保存与加载问题

数据集处理问题

……

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

MindSpore官方资料

GitHub : https://github.com/mindspore-ai/mindspore

Gitee : https : //gitee.com/mindspore/mindspore

官方QQ群 : 486831414

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值