Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >paddle DeBug 三步定位PARL飞桨报错原因,快速解决程序问题

paddle DeBug 三步定位PARL飞桨报错原因,快速解决程序问题

作者头像
汀丶人工智能
发布于 2022-12-01 08:44:34
发布于 2022-12-01 08:44:34
98100
代码可运行
举报
文章被收录于专栏:NLP/KGNLP/KG
运行总次数:0
代码可运行

相关文章:

【一】-环境配置+python入门教学

【二】-Parl基础命令

【三】-Notebook、&pdb、ipdb 调试

【四】-强化学习入门简介

【五】-Sarsa&Qlearing详细讲解

【六】-DQN

【七】-Policy Gradient

【八】-DDPG

【九】-四轴飞行器仿真

飞桨PARL_2.0&1.8.5(遇到bug调试修正)

三步定位PARL飞桨报错原因,快速解决程序问题


一、AI Studio 项目详解【VisualDL工具】

二、AI Studio 项目详解【环境使用说明、脚本任务】

三、AI Studio 项目详解【分布式训练-单机多机】

四、AI Studio 项目详解【图形化任务】

五、AI Studio 项目详解【在线部署及预测】

oschina_飞桨专区:https://www.oschina.net/group/paddlepaddle


三步定位PARL飞桨报错原因,快速解决程序问题

飞桨报错信息总体上分为两种:

  • 一种是直接在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版本)。飞桨支持两种编程模式,声明式编程模式(静态图)和命令式编程模式(动态图),我们将逐一介绍。

执行如下静态图示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import paddle.fluid as fluid
import numpy

# 1. 网络结构定义
x = fluid.layers.data(name='X', shape=[-1, 13], dtype='float32')
y = fluid.layers.data(name='Y', shape=[-1, 1], dtype='float32')
predict = fluid.layers.fc(input=x, size=1, act=None)
loss = fluid.layers.square_error_cost(input=predict, label=y)
avg_loss = fluid.layers.mean(loss)

# 2. 优化器配置
fluid.optimizer.SGD(learning_rate=0.01).minimize(avg_loss)

# 3. 执行环境准备
place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())

# 4. 执行网络
x = numpy.random.random(size=(8, 12)).astype('float32')
y = numpy.random.random(size=(8, 1)).astype('float32')
loss_data, = exe.run(fluid.default_main_program(), feed={'X': x, 'Y': y}, fetch_list=[avg_loss.name])

代码执行后的报错信息如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Traceback (most recent call last):
  File "paddle_error_case1.py", line 24, in <module>
    loss_data, = exe.run(fluid.default_main_program(), feed={'X': x, 'Y': y}, fetch_list=[avg_loss.name])
  File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/executor.py", line 1079, in run
    six.reraise(*sys.exc_info())
  File "/usr/local/lib/python3.5/dist-packages/six.py", line 696, in reraise
    raise value
  File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/executor.py", line 1074, in run
    return_merged=return_merged)
  File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/executor.py", line 1162, in _run_impl
    use_program_cache=use_program_cache)
  File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/executor.py", line 1237, in _run_program
    fetch_var_name)
paddle.fluid.core_avx.EnforceNotMet: 

--------------------------------------------
C++ Call Stacks (More useful to developers):
--------------------------------------------
0   std::string paddle::platform::GetTraceBackString<std::string const&>(std::string const&, char const*, int)
1   paddle::platform::EnforceNotMet::EnforceNotMet(std::string const&, char const*, int)
2   paddle::operators::MulOp::InferShape(paddle::framework::InferShapeContext*) const
3   paddle::framework::OperatorWithKernel::RunImpl(paddle::framework::Scope const&, paddle::platform::Place const&, paddle::framework::RuntimeContext*) const
4   paddle::framework::OperatorWithKernel::RunImpl(paddle::framework::Scope const&, paddle::platform::Place const&) const
5   paddle::framework::OperatorBase::Run(paddle::framework::Scope const&, paddle::platform::Place const&)
6   paddle::framework::Executor::RunPartialPreparedContext(paddle::framework::ExecutorPrepareContext*, paddle::framework::Scope*, long, long, bool, bool, bool)
7   paddle::framework::Executor::RunPreparedContext(paddle::framework::ExecutorPrepareContext*, paddle::framework::Scope*, bool, bool, bool)
8   paddle::framework::Executor::Run(paddle::framework::ProgramDesc const&, paddle::framework::Scope*, int, bool, bool, std::vector<std::string, std::allocator<std::string > > const&, bool, bool)

------------------------------------------
Python Call Stacks (More useful to users):
------------------------------------------
  File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/framework.py", line 2799, in append_op
    attrs=kwargs.get("attrs", None))
  File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/layer_helper.py", line 43, in append_op
    return self.main_program.current_block().append_op(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/layers/nn.py", line 349, in fc
    "y_num_col_dims": 1})
  File "paddle_error_case1.py", line 9, in <module>
    predict = fluid.layers.fc(input=x, size=1, act=None)

----------------------
Error Message Summary:
----------------------
InvalidArgumentError: After flatten the input tensor X and Y to 2-D dimensions matrix X1 and Y1, the matrix X1's width must be equal with matrix Y1's height. But received X's shape = [8, 12], X1's shape = [8, 12], X1's width = 12; Y's shape = [13, 1], Y1's shape = [13, 1], Y1's height = 13.
  [Hint: Expected x_mat_dims[1] == y_mat_dims[0], but received x_mat_dims[1]:12 != y_mat_dims[0]:13.] at (/work/paddle/paddle/fluid/operators/mul_op.cc:83)
  [operator < mul > error]

参考飞桨报错信息分析流程对这个错误示例进行剖析。

1. 首先分析代码核心错误概要。依据统一的报错结构,开发者可以快速的找到报错原因。

从示例中可获得如下信息:

这是一个参数错误;出错的Op是mul;mul Op输入的Tensor X矩阵的宽度,即第2维的大小需要和输入Tensor Y矩阵的高度,即第一维的大小相等,才可以进行正常的矩阵乘法;给出了具体的输入X与Y的维度信息即出错维度的值,有一处的维度写错了,可能是13误写成了12。

目前飞桨有12种错误类型,更多介绍请查看《报错信息文案书写规范》,链接如下:https://github.com/[PaddlePaddle](https://www.oschina.net/action/visit/ad?id=1185)/[Paddle](https://www.oschina.net/action/visit/ad?id=1185)/wiki/[Paddle](https://www.oschina.net/action/visit/ad?id=1185)-Error-Message-Writing-Specification

2. 其次分析Paddle 编译时Python错误信息栈,发现出错的代码位置如下:

Paddle插入的Python错误信息栈为了和C++栈的调用顺序保持一致,最下面的信息是用户代码的位置,这和原生python错误信息栈的顺序有所区别。这里我们可以得知,是调用fc的时候出错的,fc中包含一个乘法运算和一个加法运算,根据前面的信息可以得知是此处的乘法运算的输入数据存在问题。至此,通过检查代码,可以找到错误位置:

将代码中的12改为13,即可解决该问题。

  1. (可选)通常出错场景较为简单时,C++错误信息栈可以不关心。但如果用户在解决时遇到困难,需要飞桨开发人员协助解决时,需要反馈此信息,帮助开发人员快速得知底层的出错执行逻辑。例如在这个例子中,我们能够得知程序的执行路径为Run -> RunPreParedContext -> Run -> RunImpl -> MulOp::InferShape,InferShape是检查算子输入输出及参数维度的方法,由此可以推断出,本错误是由于Mul算子的输入参数维度出错导致。

飞桨命令式编程模式

(动态图)报错解读

动态图不区分网络模型的编译期和执行期,报错信息中不需要再插入编译时的python信息栈。执行如下动态图示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy
import paddle.fluid as fluid

place = fluid.CPUPlace()
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)

代码执行后的报错信息如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/work/scripts {master} python paddle_error_case2.py 
Traceback (most recent call last):
  File "paddle_error_case2.py", line 9, in <module>
    res = linear(data)
  File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/dygraph/layers.py", line 600, in __call__
    outputs = self.forward(*inputs, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/dygraph/nn.py", line 965, in forward
    'transpose_Y', False, "alpha", 1)
paddle.fluid.core_avx.EnforceNotMet: 

--------------------------------------------
C++ Call Stacks (More useful to developers):
--------------------------------------------
0   std::string paddle::platform::GetTraceBackString<std::string const&>(std::string const&, char const*, int)
1   paddle::platform::EnforceNotMet::EnforceNotMet(std::string const&, char const*, int)
2   paddle::operators::MatMulOp::InferShape(paddle::framework::InferShapeContext*) const
3   paddle::imperative::PreparedOp::Run(paddle::imperative::NameVarBaseMap const&, paddle::imperative::NameVarBaseMap const&, paddle::framework::AttributeMap const&)
4   paddle::imperative::Tracer::TraceOp(std::string const&, paddle::imperative::NameVarBaseMap const&, paddle::imperative::NameVarBaseMap const&, paddle::framework::AttributeMap, paddle::platform::Place const&, bool)
5   paddle::imperative::Tracer::TraceOp(std::string const&, paddle::imperative::NameVarBaseMap const&, paddle::imperative::NameVarBaseMap const&, paddle::framework::AttributeMap)

----------------------
Error Message Summary:
----------------------
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].
  [Hint: Expected mat_dim_x.width_ == mat_dim_y.height_, but received mat_dim_x.width_:2 != mat_dim_y.height_:1.] at (/work/paddle/paddle/fluid/operators/matmul_op.cc:411)
  [operator < matmul > error]

同样,我们可以依据前面讲述的步骤对报错进行分析。

  1. 先分析核心错误概要,该错误与前面的实例类似,也是输入数据的维度和预期不一致,出错的Op是matmul。
  2. 再分析Python报错信息栈,可以得知出错的代码位置为:

通过检查代码,也可以比较容易地定位到错误位置在:

将代码中的2改为1,即可解决该问题。

转载链接:https://my.oschina.net/u/4067628/blog/4462526

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
飞桨paddle遇到bug调试修正【迁移工具、版本兼容性】
paddle_upgrade_tool支持单文件的转化,你可以通过下方的命令直接转化单独的文件
汀丶人工智能
2022/12/01
7550
飞桨paddle遇到bug调试修正【迁移工具、版本兼容性】
【三】分布式训练---单机多卡与多机多卡组网(飞桨paddle2.0+)更加推荐spawn方式!
飞桨2.0增加paddle.distributed.spawn函数来启动单机多卡训练,同时原有的paddle.distributed.launch的方式依然保留。
汀丶人工智能
2022/12/21
2.8K0
飞桨核心框架最新升级:灵活高效兼顾,动静自然统一
在近期举办的“WAVE SUMMIT 2020”深度学习开发者峰会上,百度飞桨总架构师于佃海提到:
用户1386409
2020/06/16
5810
飞桨核心框架最新升级:灵活高效兼顾,动静自然统一
都9102年了还不懂动态图吗?一文带你了解飞桨动态图
导读:飞桨PaddlePaddle致力于让深度学习技术的创新与应用更简单。飞桨核心框架已提供了动态图(DyGraph)相关的API和文档,并且还附有Language model、Sentiment Classification、OCR、ResNet等模型的动态图版本官方实现。飞桨目前兼具了动态图和静态图的优势,同时具备灵活性和高效性。
用户1386409
2019/08/26
1.9K0
都9102年了还不懂动态图吗?一文带你了解飞桨动态图
飞桨动态图重大升级,全面提升灵活性、易用性
最新发布的飞桨开源深度学习框架1.7版本,带来多项重要更新。非常值得关注的是,飞桨“动态图”能力有了重大升级,不但编程体验极大提升,而且训练性能已媲美“静态图”,部署能力也有全面强化。
用户1386409
2020/05/26
6630
飞桨动态图重大升级,全面提升灵活性、易用性
【一】分布式训练---单机多卡多机多卡(飞桨paddle1.8)
     加快模型的训练速度。通过对训练任务按照一定方法拆分分配到多个计算节点进行计算,再按照一定的方法对需要汇总的信息进行聚合,从而实现加快训练速度的目的。
汀丶人工智能
2022/12/21
1.8K0
【一】分布式训练---单机多卡多机多卡(飞桨paddle1.8)
如何在Jetson nano上同时编译TensorRT与Paddle Lite框架
我从上学期开始逐渐接触飞桨深度学习框架,当时的飞桨逐步为广大开发者熟知。半年过去,生态不完善不再是扣在飞桨框架上的一顶帽子。如果你仍怀偏见,那么建议从现在开始深入地了解和使用它。
用户1386409
2020/08/04
1.7K0
如何在Jetson nano上同时编译TensorRT与Paddle Lite框架
飞桨图神经网络学习心得
之前看到一个帖子,如果有一天Pytorch和Tensorflow不开源了,我们怎么办?果断在后面回了一句,我们有飞桨啊!早点上手总有不一样的收获。对于Pytorch和Tensorflow还没了解清除的我愣是跟着老师把飞桨给跑起来了,课程干货太多,需要课下补充学习的知识也挺多的,对于我这样的小白来说,得需要点时间消化。本文只记录作为小白的入门踩坑日记,大佬可以绕道,后续将继续整理个人学习笔记。关于图神经网络的笔记后续学习后再放出,现在写也是一知半解,只是跟老师过了一遍,了解个大概,后续学习后整理。
孙小北
2024/01/30
1880
飞桨图神经网络学习心得
FAQ|训练时出现错误y_dims.size:1=y_num_col_dims:1怎么办?
在使用PaddlePaddle进行开发的过程中,难免会遇到各种各样的报错情况。我们总结了开发者们提问频率较高的问题,给出解决方案,以FAQ文章的形式陆续发出,希望能帮助大家有效“避坑”。小伙伴们也可以在评论区发出自己遇到的各种问题,我们将尽快帮您解答。
用户1386409
2019/03/07
8290
FAQ|训练时出现错误y_dims.size:1=y_num_col_dims:1怎么办?
【一】飞桨paddle【GPU、CPU】安装以及环境配置+python入门教学
PARL 的名字来源于 PAddlepaddle Reinfocement Learning,是一款基于百度 PaddlePaddle 打造的深度强化学习框架。
汀丶人工智能
2022/12/01
12.7K0
【一】飞桨paddle【GPU、CPU】安装以及环境配置+python入门教学
【1】paddle飞桨框架高层API使用讲解
飞桨框架2.0全新推出高层API,是对飞桨API的进一步封装与升级,提供了更加简洁易用的API,进一步提升了飞桨的易学易用性,并增强飞桨的功能。
汀丶人工智能
2022/12/21
9140
【1】paddle飞桨框架高层API使用讲解
【二】分布式训练---参数服务器训练(飞桨paddle1.8)
如图所示,参数服务器主要包含Server和Worker两个部分,其中Server负责参数的存储和更新,而Worker负责训练。简单来说,参数服务器训练的基本思路:当训练数据过多,一个Worker训练太慢时,可以引入多个Worker同时训练,这时Worker之间需要同步模型参数。直观想法是,引入一个Server,Server充当Worker间参数交换的媒介。当模型参数过大以至于单机存储空间不足时或Worker过多导致一个Server是瓶颈时,就需要引入多个Server。
汀丶人工智能
2022/12/21
1.2K0
【二】分布式训练---参数服务器训练(飞桨paddle1.8)
【二】强化学习之Parl基础命令--PaddlePaddlle及PARL框架{飞桨}
相关文章: 【一】飞桨paddle【GPU、CPU】安装以及环境配置+python入门教学 【二】-Parl基础命令 【三】-Notebook、&pdb、ipdb 调试 【四】-强化学习入门简介 【五】-Sarsa&Qlearing详细讲解 【六】-DQN 【七】-Policy Gradient 【八】-DDPG 【九】-四轴飞行器仿真 飞桨paddle遇到bug调试修正【迁移工具、版本兼容性】 paddle DeBug 三步定位PARL飞桨报错原因,快速解决程序问题 ---- 一、AI Studio 项目
汀丶人工智能
2022/12/01
3190
飞桨万能转换小工具X2Paddle,教你玩转模型迁移
百度推出飞桨(PaddlePaddle)后,不少开发者开始转向国内的深度学习框架。但是从代码的转移谈何容易,之前的工作重写一遍不太现实,成千上万行代码的手工转换等于是在做一次二次开发。
用户1386409
2019/07/02
9940
【六】强化学习之DQN---PaddlePaddlle【PARL】框架{飞桨}
代码链接:码云:https://gitee.com/dingding962285595/parl_work  ;github:https://github.com/PaddlePaddle/PARL
汀丶人工智能
2022/12/01
2880
【六】强化学习之DQN---PaddlePaddlle【PARL】框架{飞桨}
如何基于OpenVINO加速飞桨模型推理?
OpenVINO是英特尔基于自身现有的硬件平台开发的一种工具套件,主要用于快速开发高性能计算机视觉及深度学习视觉的应用程序和解决方案,从而实现人类视觉模拟、自动语音识别、自然语言处理和推荐系统任务。该工具套件基于最新一代的人工神经网络,包括卷积神经网络、递归网络和基于注意力的网络,可扩展跨英特尔硬件的计算机视觉和非视觉工作负载,从而最大限度地提高性能。基于OpenVINO,可提升应用程序在CPU计算设备上的推理速度。
用户1386409
2021/11/17
1.2K0
如何基于OpenVINO加速飞桨模型推理?
annotations导入报错
https://github.com/cython/cython/issues/2950#issuecomment-679136993
不止于python
2022/05/31
1.9K0
性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库
为什么难呢?因为调参就像厨师根据食材找到了料理配方,药剂师根据药材找到了药方,充满了玄幻色彩。
量子位
2020/03/18
8850
助力前沿基础科学研究,飞桨联手深度势能推动分子模拟新生态建设
开源开放已经成为驱动技术创新和加速产业发展的核心动能。开源开放对人类社会过去几百年科学和技术的发展起到非常重要的作用,让我们可以更快追踪到最新的技术进展。
用户1386409
2021/05/07
9730
助力前沿基础科学研究,飞桨联手深度势能推动分子模拟新生态建设
【八】强化学习之DDPG---PaddlePaddlle【PARL】框架{飞桨}
代码链接:码云:https://gitee.com/dingding962285595/parl_work  ;github:https://github.com/PaddlePaddle/PARL
汀丶人工智能
2022/12/01
5050
【八】强化学习之DDPG---PaddlePaddlle【PARL】框架{飞桨}
推荐阅读
相关推荐
飞桨paddle遇到bug调试修正【迁移工具、版本兼容性】
更多 >
LV.6
阿里算法工程师
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验