当前位置:首页 > 技术分析 > 正文内容

Torch-npu报错定位技巧(torch.load no module)

ruisui883个月前 (02-03)技术分析30

1,训练功能问题定位思路

训练功能问题定位思路

Torch-npu错误码

CANN错误码

2,精度问题定位思路

精度问题定位思路

3,未知错误定位技巧

3.1 通过torch.npu.synchronize定位

案例:训练网络过程中出现流同步报错,明显不是python报错行。

解决方案:使用torch.npu.synchronize()排查报错位置。

第一步:首先增加环境变量:export TASK_QUEUE_ENABLE=0

第二步:在77行代码前每几行就加 torch.npu.synchronize(),再执行

有两种可能:

1、代码挂在新增的torch.npu.synchronize()

2、代码没有挂在新增的torch.npu.synchronize()

如果是第一种,则说明真实报错点在新增的torch.npu.synchronize()之前

如果是第二种,则说明真实报错点在新增的torch.npu.synchronize()之后

第三步:不停地打torch.npu.synchronize(),直到找打这一行:它前面的torch.npu.synchronize()没有报错,它后面的torch.npu.synchronize()报错了。

第四步:构造torch.gather的单算子用例,成功复现报错:

3.2通过msprof定位单算子问题

案例:训练网络过程中发现有算子报错,但不知道是哪个算子:

定位方案:使用msprof找到报错api。

第一步:脚本内设置callstack开关和 e2e profiling,

第二步:运行脚本,msprof数据会以PROF_XXX形式落盘到profiler_result_path

第三步:解析PROF_XXX目录

第四步:将timeline目录中的msprof.json拖入chrome://tracing/

第五步:从profiling timeline的末端观察报错的算子

第六步:torch.save输入输出后进行单算子问题复现,提供device日志给研发确认(提交issue、发帖)

第七步:研发确认,输入存在inf

3.3 编译debug版本调试

案例:发生coreDump或者Segment fault后,使用gdb查看堆栈,存在“??”符号:

第一步:编译debug版本的包:DEBUG=1 bash ci/build.sh --python=3.8

编完DEBUG,如果大小明显增加,如9M增加到200+M,说明DEBUG选项生效;

第二步:执行 gdb python,进入gdb,设置break,比如我们要debug GetDescForSerialization函数,就输入break GetDescForSerialization,选y,也可以直接break {文件}:{行数}。然后run脚本,例如此处我们的python脚本为tmp.py,就输入run tmp.py

第三步:gdb会一路执行到break的点

相较于release模式,debug模式下函数入参会显示为入参名字,可以直接print 出来。我们打印下要debug的对象,如 p desc,可以看到 desc.base_sizes_的内部成员的变量没有初始化赋值,主要是由于fake tensor没有storage但走到了这个流程导致的,我们直接添加storage是否为空的判断即可通过用例。

3.4 更换so实现debug功能

案例:机器不支持编译debug版本,但是其他人有编译的so。

解决方案:拷贝被人的so,替换自己torch-npu安装目录下的so

第一步:假如torch_npu安装目录为
/root/miniforge-pypy3/envs/cbn/lib/python3.8/site-packages/torch_npu

打开dbg文件夹:

第二步:如果调用栈是libtorch_npu.so内的函数为问号,则将libtorch_npu.so.debug拷贝到
/root/miniforge-pypy3/envs/cbn/lib/python3.8/site-packages/torch_npu/lib

注意:一定要保证debug文件和安装的torch_npu包是同一版本

3.5 python segment fault定位到行的方法

解决方案:用 python -X faulthandler xx.py

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1207.html

标签: pypy3
分享给朋友:

“Torch-npu报错定位技巧(torch.load no module)” 的相关文章

git的几种分支模式

编写代码,是软件开发交付过程的起点,发布上线,是开发工作完成的终点。代码分支模式贯穿了开发、集成和发布的整个过程,是工程师们最亲切的小伙伴。那如何根据自身的业务特点和团队规模来选择适合的分支模式呢?本文分享几种主流 Git 分支模式的流程及特点,并给出选择建议。分支的目的是隔离,但多一个分支也意味着...

前后端分离自动化运维平台开发

运维平台采用前后端分离:前端vue,框架vue-element-admin;后端python,框架django-rest-framework.目前运维平台模块如下:1、 CMDB管理应用管理、环境管理、开发语言管理、产品项目管理、资产管理2、 构建发布持续构建、持续部署、Jar工程依赖构建3、 容器...

代码分支规范

一.gitflow工作流说明:主分支:master,稳定版本代码分支,对外可以随时编译发布的分支,不允许直接Push代码,只能请求合并(pull request),且只接受hotfix、release分支的代码合并。gitlab上做限制。热修复分支:hotfix,针对现场紧急问题、bug修复的代码分...

Python中的11 种数组算法

1. 创建数组 创建数组意味着留出一个连续的内存块来存储相同类型的元素。在大多数语言中,您可以在创建数组时指定数组的大小。假设您正在书架上整理一组书籍,并且您需要为正好 10 本书预留空间。功能架上的每个空间都对应于数组中的一个索引。# Example in Python arr = [1, 2,...

Vue实现动态路由

通常我们在vue项目中都是前端配置好路由的,但在一些项目中我们可能会遇到权限控制,这样我们就涉及到动态路由的设置了。动态路由设置一般有两种:(1)、简单的角色路由设置: 比如只涉及到管理员和普通用户的权限。通常直接在前端进行简单的角色权限设置(2)、复杂的路由权限设置: 比如OA系统、多种角色的权限...

尤雨溪:细聊 Vue 的现在与未来

大家好,我是 Echa。创作不易,喜欢的老铁们转发加个关注,点个赞,速速收藏,谢谢!另外咱们一起回顾一下Vue 优秀开源项目:12个又简单又实用的开源项目及组件推荐13个又热门又实用的Vue开源宝典库推荐7个Vue 3的高颜值UI组件库分享15个基于Vue3.0全家桶的优秀开源项目推荐10个基于Vu...