相关文章:

【一】-环境配置+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版本)。飞桨支持两种编程模式,声明式编程模式(静态图)和命令式编程模式(动态图),我们将逐一介绍。

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

  1. import paddle.fluid as fluid
  2. import numpy
  3. # 1. 网络结构定义
  4. x = fluid.layers.data(name='X', shape=[-1, 13], dtype='float32')
  5. y = fluid.layers.data(name='Y', shape=[-1, 1], dtype='float32')
  6. predict = fluid.layers.fc(input=x, size=1, act=None)
  7. loss = fluid.layers.square_error_cost(input=predict, label=y)
  8. avg_loss = fluid.layers.mean(loss)
  9. # 2. 优化器配置
  10. fluid.optimizer.SGD(learning_rate=0.01).minimize(avg_loss)
  11. # 3. 执行环境准备
  12. place = fluid.CPUPlace()
  13. exe = fluid.Executor(place)
  14. exe.run(fluid.default_startup_program())
  15. # 4. 执行网络
  16. x = numpy.random.random(size=(8, 12)).astype('float32')
  17. y = numpy.random.random(size=(8, 1)).astype('float32')
  18. loss_data, = exe.run(fluid.default_main_program(), feed={'X': x, 'Y': y}, fetch_list=[avg_loss.name])

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

  1. Traceback (most recent call last):
  2. File "paddle_error_case1.py", line 24, in <module>
  3. loss_data, = exe.run(fluid.default_main_program(), feed={'X': x, 'Y': y}, fetch_list=[avg_loss.name])
  4. File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/executor.py", line 1079, in run
  5. six.reraise(*sys.exc_info())
  6. File "/usr/local/lib/python3.5/dist-packages/six.py", line 696, in reraise
  7. raise value
  8. File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/executor.py", line 1074, in run
  9. return_merged=return_merged)
  10. File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/executor.py", line 1162, in _run_impl
  11. use_program_cache=use_program_cache)
  12. File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/executor.py", line 1237, in _run_program
  13. fetch_var_name)
  14. paddle.fluid.core_avx.EnforceNotMet:
  15. --------------------------------------------
  16. C++ Call Stacks (More useful to developers):
  17. --------------------------------------------
  18. 0 std::string paddle::platform::GetTraceBackString<std::string const&>(std::string const&, char const*, int)
  19. 1 paddle::platform::EnforceNotMet::EnforceNotMet(std::string const&, char const*, int)
  20. 2 paddle::operators::MulOp::InferShape(paddle::framework::InferShapeContext*) const
  21. 3 paddle::framework::OperatorWithKernel::RunImpl(paddle::framework::Scope const&, paddle::platform::Place const&, paddle::framework::RuntimeContext*) const
  22. 4 paddle::framework::OperatorWithKernel::RunImpl(paddle::framework::Scope const&, paddle::platform::Place const&) const
  23. 5 paddle::framework::OperatorBase::Run(paddle::framework::Scope const&, paddle::platform::Place const&)
  24. 6 paddle::framework::Executor::RunPartialPreparedContext(paddle::framework::ExecutorPrepareContext*, paddle::framework::Scope*, long, long, bool, bool, bool)
  25. 7 paddle::framework::Executor::RunPreparedContext(paddle::framework::ExecutorPrepareContext*, paddle::framework::Scope*, bool, bool, bool)
  26. 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)
  27. ------------------------------------------
  28. Python Call Stacks (More useful to users):
  29. ------------------------------------------
  30. File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/framework.py", line 2799, in append_op
  31. attrs=kwargs.get("attrs", None))
  32. File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/layer_helper.py", line 43, in append_op
  33. return self.main_program.current_block().append_op(*args, **kwargs)
  34. File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/layers/nn.py", line 349, in fc
  35. "y_num_col_dims": 1})
  36. File "paddle_error_case1.py", line 9, in <module>
  37. predict = fluid.layers.fc(input=x, size=1, act=None)
  38. ----------------------
  39. Error Message Summary:
  40. ----------------------
  41. 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.
  42. [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)
  43. [operator < mul > error]

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

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

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

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

目前飞桨有12种错误类型,更多介绍请查看《报错信息文案书写规范》,链接如下:https://github.com/PaddlePaddle/Paddle/wiki/Paddle-Error-Message-Writing-Specification

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

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

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

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

飞桨命令式编程模式

(动态图)报错解读

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

  1. import numpy
  2. import paddle.fluid as fluid
  3. place = fluid.CPUPlace()
  4. with fluid.dygraph.guard(place):
  5. x = numpy.random.random(size=(10, 2)).astype('float32')
  6. linear = fluid.dygraph.Linear(1, 10)
  7. data = fluid.dygraph.to_variable(x)
  8. res = linear(data)

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

  1. /work/scripts {master} python paddle_error_case2.py
  2. Traceback (most recent call last):
  3. File "paddle_error_case2.py", line 9, in <module>
  4. res = linear(data)
  5. File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/dygraph/layers.py", line 600, in __call__
  6. outputs = self.forward(*inputs, **kwargs)
  7. File "/usr/local/lib/python3.5/dist-packages/paddle/fluid/dygraph/nn.py", line 965, in forward
  8. 'transpose_Y', False, "alpha", 1)
  9. paddle.fluid.core_avx.EnforceNotMet:
  10. --------------------------------------------
  11. C++ Call Stacks (More useful to developers):
  12. --------------------------------------------
  13. 0 std::string paddle::platform::GetTraceBackString<std::string const&>(std::string const&, char const*, int)
  14. 1 paddle::platform::EnforceNotMet::EnforceNotMet(std::string const&, char const*, int)
  15. 2 paddle::operators::MatMulOp::InferShape(paddle::framework::InferShapeContext*) const
  16. 3 paddle::imperative::PreparedOp::Run(paddle::imperative::NameVarBaseMap const&, paddle::imperative::NameVarBaseMap const&, paddle::framework::AttributeMap const&)
  17. 4 paddle::imperative::Tracer::TraceOp(std::string const&, paddle::imperative::NameVarBaseMap const&, paddle::imperative::NameVarBaseMap const&, paddle::framework::AttributeMap, paddle::platform::Place const&, bool)
  18. 5 paddle::imperative::Tracer::TraceOp(std::string const&, paddle::imperative::NameVarBaseMap const&, paddle::imperative::NameVarBaseMap const&, paddle::framework::AttributeMap)
  19. ----------------------
  20. Error Message Summary:
  21. ----------------------
  22. 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].
  23. [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)
  24. [operator < matmul > error]

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

1. 先分析核心错误概要,该错误与前面的实例类似,也是输入数据的维度和预期不一致,出错的Op是matmul。

2. 再分析Python报错信息栈,可以得知出错的代码位置为:

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

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

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

paddle DeBug 三步定位PARL飞桨报错原因,快速解决程序问题的更多相关文章

  1. idea类里面编译报错,快速定位快捷键设置

    settings---->keyMap------->Main menu----------->在搜索框里输入error,找到Next Highlighted Error 和Prev ...

  2. 从零开始学安全(三十一)●kali 输入 msfconsole 启动报错

    解决方法: 实际上是因为没安装就开启了msf,用下面三个命令就解决了 sudo apt-get updatesudo apt-get install metasploit-frameworkmsfco ...

  3. LVM XFS增加硬盘分区容量最后一步的时候动态扩容报错

    在我们lvextend扩容完之后,想动态扩容时出现错误.我们可以用以下命令来进行操作. 若不是xfs我们可以用resize2fs,这里报错了 [root@Mysql01-213-66 ~]# resi ...

  4. 三、SpringBoot启动时JDBC报错:You must configure either the server or JDBC driver (via the serverTimezone configuration property)

    错误提示: Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connectio ...

  5. 安卓使用讯飞sdk报错

    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.iflytek.cloud.SpeechSy ...

  6. 三个思路解决413 Request Entity Too Large报错处理

    最近一个项目当中,要求上传图片,并且限制图片大小,虽然在laravel当中已经添加了相关的表单验证来阻止文件过大的上传,然而当提交表单时,还没轮到laravel处理,nginx就先报错了.当你仔细看报 ...

  7. Java Web项目(Extjs)报错三

    1. Java Web项目(Extjs)报错三 具体报错如下: at org.jbpm.pvm.internal.processengine.SpringHelper.createProcessEng ...

  8. 使用tagName定位报错

    使用标签进行定位元素,页面报错,由于input标签不唯一,webdriver默认会取第一个元素,但是第一个input元素的类型是‘hidden’,无法展示,因此程序就报错了 如何解决,未完待续...

  9. Idea debug报错Command line is too long

    问题: 使用idea开发Java项目,写单元测试,debug时,会有红字报错:Command line is too long 解决方法: 在项目的目录下,找到/.idea/workspace.xml ...

  10. sql注入 报错注入常用的三种函数

    1.floor()函数 报错原因是 报错的原因是因为rand()函数在查询的时候会执行一次,插入的时候还会执行一次.这就是整个语句报错的关键 前面说过floor(rand(0)*2) 前六位是0110 ...

随机推荐

  1. pyshorteners 长短链接转换

    import requests import pyshorteners as psn def long_to_short(url): url = psn.Shortener().chilpit.sho ...

  2. 系统学Prompt,强烈推荐这3个教程,OpenAI还是最强

    系统学Prompt,强烈推荐这3个教程 OpenAI官方Prompt教程 这是最权威.最详细.最值得深入学习的提示词工程学习教程! 教程地址:https://platform.openai.com/d ...

  3. 【辅助工具】Apifox

    注意事项 需要刷新权限 请求方式需要对应

  4. Divide by Zero 2021 and Codeforces Round #714 (Div. 2) 个人补题记录

    补题链接:Here A. Array and Peaks 题意:给定 数组大小 \(n\) 和 峰值点 \(k\) 请问是否存在这样的排序,不存在则输出-1 先序从 i = 2 开始填,依次 i += ...

  5. elementUI表格单选

    html代码 <el-table :data="gkbmList" max-height="264" border @selection-change=& ...

  6. 这才是你应该了解的Redis数据结构!

    深入了解Redis数据结构 Redis,作为一种高性能的内存数据库,支持多种数据结构,从简单的字符串到复杂的哈希表.在这篇博文中,我们将深入探讨Redis的一些主要数据结构,并通过详细的例子展示它们的 ...

  7. C++ 利用模板偏特化和 decltype(()) 识别表达式的值类别

    刚刚看到一篇 C++ 博客,里面讲到用模板偏特化和 decltype() 识别值类别:lvalue glvalue xvalue rvalue prvalue.依照博客的方法试了一下,发现根本行不通. ...

  8. ACP 知识点总结

    记录下学习ACP过程不断遇到的且需要记录的知识点: 在阿里云专有网络VPC创建之后,路由器也是随着VPC一起自动创建,所以不需要手动创建,这个时候需要继续创建交换机才能在交换机种创建其他云产品. 7层 ...

  9. Nacos源码 (5) Grpc服务端和客户端

    Nacos 2.x在服务端与客户端直接增加了GRPC通信方式,本文通过2.0.2版本源码,简单分析GRPC通信方式: 服务器启动 客户端连接 客户端心跳 服务器监控检查 服务器 proto文件 api ...

  10. crypto常用工具

    古典密码 维吉尼亚密码(Vigenere): https://github.com/atomcated/Vigenere(加密解密程序,包含自动猜测密钥功能) https://www.guballa. ...