【故事的开始…】 小张是一名AI算法攻城狮,听闻飞桨乃国产开源深度学习框架之光,心想炎黄子孙当自强,用自己的深度学习框架,实现中国的AI梦…… 下载安装命令 ## CPU版本安装命令 pip in…
【故事的开始…】
小张是一名AI算法攻城狮,听闻飞桨乃国产开源深度学习框架之光,心想炎黄子孙当自强,用自己的深度学习框架,实现中国的AI梦……
下载安装命令
CPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle
GPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
他尝试在的笔记本上使用飞桨搭建线性回归示例模型。
噼里啪啦…噼里啪啦…键盘敲的热血澎湃。跑下试试……
然而,模型的打印结果让小张满怀期待的小心情顿时哇凉哇凉的。
丹还没炼成,炉咋就坏了呢?这铺天盖地的error,要怎么分析和处理?
【故事的转折…】
同学且慢,经官方鉴定,小张大概率使用的是较早版本的飞桨,飞桨开源框架1.7及之后版本断然不会出现这么繁杂的报错信息了。
这是因为飞桨工程师们一直期望产品不但好用,而且易用,可以给开发者带来一点点工作上的愉悦。报错信息对调试分析至关重要,飞桨工程师也一直在持续地进行改进和优化。
解读最新的飞桨报错信息
飞桨报错信息总体上分为两种:一种是直接在Python层拦截报出的错误,这种问题一般比较直观,根据Python原生的报错栈即可以定位程序中的问题,和大家使用Python写程序报错分析的流程一致;一种是飞桨的C++ core中的报错,这种报错包含的信息量较大。下面我们以此类报错信息的为例,解读分析过程。
首先我们了解下目前飞桨最新版本报错信息的结构,如下图:
报错信息为四段式结构,由上至下依次为Python默认错误信息栈、C++错误信息栈、飞桨Python错误信息栈(仅声明式编程模式)、核心错误概要。
Python默认错误信息栈:执行Python程序默认记录的执行路径,对定位报错位置很有帮助。这是Python本身特性,此处不展开介绍。
C++错误信息栈:程序在Paddle C++ core中的错误路径,即为模块paddle.fluid.core中的程序执行路径,这部分信息对开发者帮助有限。但当开发者通过Issue向飞桨开发人员提问时,提供C++报错栈的信息将有助于开发人员快速定位问题。(目前C++错误信息栈仅支持Unix平台,Windows平台暂不支持)
Paddle Python错误信息栈:为什么这里还有一个Paddle Python错误信息栈呢?因为在声明式编程模式(静态图)下,模型编译和执行是分离的。执行时报错的路径由Python默认程序栈记录,但这并不能告知用户具体出错的程序位置,因此对于算子类型的API,飞桨额外记录了编译时的执行路径,帮助开发者定位具体代码出错的位置,该部分信息对于调试具有较大意义。
核心错误概要:信息包含错误类型、错误特征、概要提示、出错文件名与行号、出错算子名等,这些信息不仅有助于开发者理解错误,也有助于迅速定位错误。
为什么如此重要的错误概要放在最后,而不是最前面呢?飞桨开发同学考虑到开发者在终端执行程序的场景较多,为了便于用户在程序执行完后能够马上看到最重要的提示信息,才将其置于最后。
硬核来了,3步快速定位问题
当使用飞桨遇到报错提示时,定位流程是啥样子的呢?请对应上文提到的飞桨报错信息结构图,按如下流程逐步分析。
报错信息分析流程
下面结合示例,向大家讲解飞桨的报错信息的分析过程(示例使用飞桨2020年7月1日的develop版本)。飞桨支持两种编程模式,声明式编程模式(静态图)和命令式编程模式(动态图),我们将逐一介绍。
飞桨声明式编程模式
(静态图)报错解读
执行如下静态图示例代码:
1 | import paddle.fluid as fluid |
with fluid.dygraph.guard(place):
x = numpy.random.random(size=(10, 2)).astype(‘float32’)
linear = fluid.dygraph.Linear(1, 10)
data = fluid.dygraph.to_variable(x)
res = linear(data)
1 |
/work/scripts {master} python paddle_error_case2.py
File “paddle_error_case2.py”, line 9, in
1 | File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/dygraph/layers.py", line 600, in __call__ |
outputs = self.forward(*inputs, **kwargs)
1 | File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/dygraph/nn.py", line 965, in forward |
‘transpose_Y’, False, “alpha”, 1)
1 |
|
1 | InvalidArgumentError: Input X's width should be equal to the Y's height, but received X's shape: [10, 2],Y's shape: [1, 10]. |
同样,我们可以依据前面讲述的步骤对报错进行分析。
1. 先分析核心错误概要,该错误与前面的实例类似,也是输入数据的维度和预期不一致,出错的Op是matmul。
2. 再分析Python报错信息栈,可以得知出错的代码位置为:
通过检查代码,也可以比较容易地定位到错误位置在:
将代码中的2改为1,即可解决该问题。
【故事的尾声…】
报错信息的有效性与框架的易用性息息相关,飞桨团队也仍然在持续地优化报错信息的质量和友好度,希望能给文中的小张同学及广大开发者带来更好的产品体验。如果大家发现报错信息不准确、不直接、不易读等问题,也欢迎通过Issue及时反馈给我们。让我们期待飞桨的易用性能够进一步提升,成为功能强大、令开发者工作愉悦的国产开源深度学习框架。
本文标题: 秉承工匠精神3步
发布时间: 2021年03月05日 00:00
最后更新: 2025年12月30日 08:54
原始链接: https://haoxiang.eu.org/65561179/
版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!

