记多任务基础模型的常见bug和debug历程

这篇具有很好参考价值的文章主要介绍了记多任务基础模型的常见bug和debug历程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

最近一年实在是忙得焦头烂额,好久没更新了,最近被各种大模型和基础模型逼上了悬崖,既然打不过那就加入,不然会后悔。虽然之前有一些多任务模型的基础,但面对基础模型的开发,对于完全不同的设计和开发范式,刚开始就碰壁了,主要是关于DDP, torch版本以及多任务模型设计之间的兼容问题。

BUG历程

Bug1: RuntimeError: Output 0 of SliceBackward0 is a view and is being modified inplace. This view is the output of a function that returns multiple views. Such functions do not allow the output views to be modified inplace. You should replace the inplace operation by an out-of-place one.

解说:此bug诞生于DDP模式下,YOLOX解耦头解码计算loss这个过程。其问题主要还是在于torch 1.10本身的bug,这个bug在torch1.11之后被修复,1.9以及更低的版本也同样没有此bug。虽然网上大家的做法都是对于Output,clone一个新的变量,但这个做法在DDP模式下的YOLOX效果很差,学会导致学习过程放缓,具体原因不详,暂时没空去深究,我的建议是不要用torch 1.10。

Bug2: 模型内部组件报错,也就是nn.Module下的模型未使用的自定义模块报错。

解说:此bug问题还是跟DDP有关,

model_train = torch.nn.parallel.DistributedDataParallel(model_train, device_ids=[local_rank],
                                                                    find_unused_parameters=True)

当我们令find_unused_parameters为True时,如果我们的torch版本为1.10以下的,由于我们的模型是多任务基础模型,那么一个epoch我们只会使用其中一个或几个任务头,还剩下一些任务头虽然已经被定义,但当前epoch是不会参与反向传播的,那么就会报错。解决方案为:将没有参与反向传播的任务头的输出 * 0并将ground-truth设置为0,让未参与反向传播的任务头执行伪正向传播+反向传播,但这么做的弊端是会增加显存占用。我建议的解决方案是使用torch 1.11及以上的版本,因为torch forum上官方说他们在1.10的版本里已经解决了这个bug,允许DDP模式下未参与反向传播的参数的存在,但Bug1中提到了1.10的问题,那么我建议使用1.11及以上的版本。

Bug3: Multiple GPU model getting RuntimeError: Caught RuntimeError in replica 0 on device 0

解说:用DDP,别用DP,当然前提是你的机子是linux的。Windows+DP模式下不会有这个问题,Windows选手不用担心。

Bug4: RuntimeError: CUDA error: device-side assert triggered, Assertion input_val >= zero && input_val <= one failed.

解说:这是个常见的索引溢出问题,但索引溢出只是表面原因。常见的解决方案是检查类别数量和模型任务头的大小是否一致,以及在目标检测任务中,bounding box的范围是否在图像大小内。要么就是sqrt的参数小于0。如果你使用了YOLOX中的SimOTA算法,那么也有可能是学习率太大的原因,目前这个问题在官方仓库中仍然没有被解决,主流的方法是调小学习率。当然,也有同学的问题是由于用了混合精度训练。但是,如果你检查过不是上述原因了,而且这个Bug伴随着Bug5一块来,那么就不是这么简单了,请看Bug5的解决方案。

Bug5: torch.distributed.elastic.multiprocessiong.erroes.ChildFailedError

解说:此bug也是DDP模式下的一个多线程同步的问题, 此类问题的解决方案:1.查看安装的包是否与要求的一致。2.更改batch的大小。3.查看其中是否有某一个gpu被占用。4. 也有可能是用了混合精度训练导致的,很迷。

torch.distributed.elastic.multiprocessing.api.SignalException: Process 40121 got signal: 1

在pytorch的多GPU并行时,会有概率会出现以上的问题,当关闭会话窗口的时候,相应的并行程序也就终止了。

一种解决方法使用tmux,

tmux的使用方法:

Tmux的启动:tmux

带有名字的启动:tmux new -s 名称

退出:exit

分离会话:tmux detach

重新会话:tmux a -t 名称

Kill会话:tmux kill-session -t 名称

切换:tmux switch -t 名称

重命名:tmux rename-session -t 名称 名称1

至于为什么,可以了解一下报错的原因以及tmux的原理。

Bug6: 使用混合精度+YOLOX的SimOTA或YOLOv8的TaskAssigner做正样本匹配时loss为nan

解说:使用梯度截断来解决此问题。文章来源地址https://www.toymoban.com/news/detail-455307.html

scaler.scale(loss_value).backward()
scaler.unscale_(optimizer)  # unscale gradients
torch.nn.utils.clip_grad_norm_(model_train.parameters(), max_norm=10.0)  
scaler.step(optimizer)
scaler.update()

Bug7: 希望别再有了,

到了这里,关于记多任务基础模型的常见bug和debug历程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【bug】vscode python 3.6 无法debug 解决方案

    某个环境是使用python 3.6 安装的,vscode没法调试。是由于python插件太新了,直接下载一个,用VSIX安装 1.下载python 拓展包 https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-python/vsextensions/python/2022.6.0/vspackage 2.可以将2022.6.0更改为指定版本,2022.6.0经过测试支持python 3.6 在v

    2024年02月11日
    浏览(55)
  • 【BUG解决】vscode debug python launch.json添加args不起作用

    为了带入参数调试python 程序,点击了ui界面右上角的debug按钮,配置了lauch.json文件。按照网上搜到的教程添加了 \\\"args\\\": 但是点击ui界面的debug按钮,发现配置的参数并不起作用。 原因: 在 vscode-python 项目的issue和issue里找到答案。 省流:ui界面右上角的debug按钮是一个扩展插件

    2024年02月16日
    浏览(43)
  • 【大数据】流处理基础概念(三):状态和一致性模型(任务故障、结果保障)

    流处理基础概念(一):Dataflow 编程基础、并行流处理 流处理基础概念(二):时间语义(处理时间、事件时间、水位线) 流处理基础概念(三):状态和一致性模型(任务故障、结果保障) 😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点

    2024年01月25日
    浏览(49)
  • Java基础--->IO流(2)【常见IO模型】

    根据冯.诺依曼结构,计算机结构分为 5 大部分:运算器、控制器、存储器、输入设备、输出设备。 从计算机结构的视角来看的话, I/O 描述了计算机系统与外部设备之间通信的过程。 IO (Input/Output) 通常是指计算机与外部设备之间的数据交换过程。输入设备(如键盘、鼠标、

    2024年02月06日
    浏览(32)
  • Serverless架构的理论基础和发展历程

    随着云计算技术的不断发展,越来越多的企业开始将应用迁移到云端。在这个过程中,Serverless架构逐渐成为了一种热门的技术选择。Serverless架构是一种基于事件驱动的计算模型,它允许开发者在不管理底层服务器的情况下构建和运行应用程序。本文将介绍Serverless架构的理论

    2024年02月01日
    浏览(49)
  • Advanced .Net Debugging 4:基本调试任务(对象检查:内存、值类型、引用类型、数组和异常的转储)

    一、介绍 这是我的《 Advanced .Net Debugging 》这个系列的第四篇文章。今天这篇文章的标题虽然叫做“基本调试任务”,但是这章的内容还是挺多的。由于内容太多,故原书的第三章内容我分两篇文章来写。上一篇我们了解了一些调试技巧,比如:单步调试、下断点、过程调试

    2024年03月09日
    浏览(45)
  • PHP常见特性(bug)

    目录 前言: 1、intval(): 一些特性: 2、__wakeup() : 3、strcmp() : 4、assert(): 5、eval(): 6、include(): 7、readfile(): 8、call_user_func(): 9、trim(): 10、is_number(): 11、extract(): 12、parse_str(): 13、get_defined_vars(): 14、gettext(): 15、匿名函数(create_function): 16、$_SERVER[\\\'argv\\\']: 17、哈希函数:

    2024年02月04日
    浏览(44)
  • 测试常见前端bug

    目录 协作 后端:确定 数据类型保持一致 修改公共组件:同步修改 测试方法 标签:标签 内容/ref/ 调用方法/属性前要确保一定存在:赋初值/判断 arrarr.length this.$message.error(e e.msg) UI 动态文字 交互 包裹icon 样式不生效:devtools查找,编译前的标签,运行时不一定存在 可交互的

    2024年02月15日
    浏览(44)
  • 常见的一些BUG

    常见的一些BUG,但实际上在编写代码时,我们应该尽可能避免这些类型的错误: 变量名与函数名冲突: 函数参数传递错误: 运算符优先级错误: 嵌套循环计算错误: 条件语句逻辑错误: 函数返回值错误: 变量作用域错误: 循环未正确终止: 函数递归调用导致无限循环:

    2024年02月13日
    浏览(49)
  • 【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解

    GDB全称GNU symbolic debugger,它是诞生于GNU开源组织的(同时诞生的还有 GCC、Emacs 等)UNIX及UNIX-like下的调试工具,是Linux下最常用的程序调试器,GDB 支持调试多种编程语言编写的程序,包括C、C++、Go、Objective-C、OpenCL、Ada 等。但是在实际应用中,GDB 更常用来调试C和C++程序。虽然

    2023年04月17日
    浏览(97)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包