PyTorch训练多任务模型技巧

一、解决在分布式训练中,如果对同一模型进行多次调用的报错

报错如下:

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [256)] is at version 4; expected version 3 instead. Hint: enable anomaly detection to find the operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True).

参考知乎文章《【PyTorch踩坑】一个排查了一下午的坑》

 经过一些调试发现,只有当某些特定情况下才会触发此报错。下面结合一个对比学习的例子(并不是完整的脚本)来简单描述:

import torch
import torch.nn as nnfrom torchvision.models import resnet50def main():model = resnet50(num_classes=256).cuda()model = nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank], find_unused_parameters=True)criterion = nn.MSELoss()optimizer = torch.optim.SGD(model.parameters(),lr=0.001,momentum=0.99,weight_decay=1e-4)for i in range(10):input0 = torch.randn((4, 3, 224, 224), dtype=torch.float32).cuda()input2 = torch.randn((4, 3, 224, 224), dtype=torch.float32).cuda()out1 = model(input0)out2 = model(input1)loss = criterion(out1, out2)optimizer.zero_grad()loss.backward()optimizer.step()if __name__ == '__main__':main()

经过调试发现,当使用nn.DataParallel并行训练或者单卡训练均可正常运行;另外如果将两次模型调用集成到model中,即通过out1, out2 = model(input0, input1) 的方式在分布式训练下也不会报错。

由此可以猜测:在分布式训练中,如果对同一模型进行多次调用则会触发以上报错,即nn.parallel.DistributedDataParallel方法封装的模型,forword()函数和backward()函数必须交替执行,如果执行多个(次)forward()然后执行一次backward()则会报错。

那么解决此问题的入手点则可以聚焦到nn.parallel.DistributedDataParallel接口上。 通过查询PyTorch官方文档发现此接口下的两个参数:

- find_unused_parameters: 如果模型的输出有不需要进行反向传播的,此参数需要设置为True;若你的代码运行后卡住不动,基本上就是该参数的问题。
- broadcast_buffers: 该参数默认为True,设置为True时,在模型执行forward之前,gpu0会把buffer中的参数值全部覆盖到别的gpu上。

问题基本可以定位出来了,即broadcast_buffers=True导致参数被覆盖修改。解决办法:

 model = nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank], broadcast_buffers=False,find_unused_parameters=True)

参考

distributed: https://pytorch.org/docs/stable/distributed.html

Inplace error if DistributedDataParallel module that contains a buffer is called twice

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/591788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

听GPT 讲Rust源代码--compiler(2)

File: rust/compiler/rustc_codegen_cranelift/build_system/prepare.rs 在Rust源代码中,rust/compiler/rustc_codegen_cranelift/build_system/prepare.rs文件的作用是为Cranelift代码生成器构建系统准备依赖项。 具体来说,该文件的主要目标是处理Crane…

C语言注意点(2)

1.使用pow函数的相关问题 局部变量n0 while(num/pow(10,n)) n; 为什么不可行 printf("%d",num/pow(10,4)%10) 为什么要提前用temp先引出来 答:pow函数的返回值为double类型,1.终止条件不会满足 2.num/pow(10,4)结果为浮点型,浮…

牛客小白月赛84

A打靶 题目描述 小蓝非常喜欢玩FPS类游戏,最近他迷上了一款打靶游戏,已知总共会出现 n\mathit nn 个靶子,每次开枪如果打中了靶子则会得到 1\text 11 分,另外不论这次开枪打中与否,靶子都将消失,现在有 m…

提高ThinkPHP对url的安全性

要提高ThinkPHP对url的安全性,可以考虑以下几点: 1. 使用URL重写:在ThinkPHP框架中,可以通过配置文件或者.htaccess文件启用URL重写功能,将URL中的参数隐藏起来,更难被攻击者猜测和利用。 2. 进行输入验证…

为即将到来的量子攻击做好准备的 4 个步骤

当谈到网络和技术领域时,一场风暴正在酝酿——这场风暴有可能摧毁我们数字安全的根本结构。这场风暴被称为 Q-Day,是即将到来的量子计算时代的简写,届时量子计算机的功能将使最复杂的加密算法变得过时。 这场量子革命正以惊人的速度到来&am…

如何使用Node.js快速创建本地HTTP服务器并实现公网访问服务端

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

正则表达式基础

文章目录 发现宝藏前言1. 正则表达式的定义2. 常见的正则表达式字符3. 经典示例3.1 匹配电子邮件地址3.2 匹配URL3.3 匹配日期3.4 匹配IP地址3.5 匹配HTML标签3.6 匹配电话号码3.7 匹配用户名 发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂&#xff0…

三、C语言中的分支与循环—while循环 (5)

本章分支结构的学习内容如下: 三、C语言中的分支与循环—if语句 (1) 三、C语言中的分支与循环—关系操作符 (2) 三、C语言中的分支与循环—条件操作符 与逻辑操作符(3) 三、C语言中的分支与循环—switch语句(4)分支结构 完 本章循环结…

虚拟机类加载机制

类的生命周期 类的生命周期指的是在Java程序中,一个类从编写到被加载、连接、初始化、使用、卸载的整个过程。类的生命周期可以分为以下几个阶段: 加载,验证,准备,解析,初始化,使用&#xff0…

2023年郑州轻工业大学软件学院数据结构实验五-查找与排序(详解+源码C语言版+运行结果)

实验要求 一、实验目的 1.掌握常用的查找和排序算法思想; 2.能够用所学过的查找和排序算法解决生活中的实际应用问题。 二、课程目标 支撑课程目标(4):能够在软件开发过程中,针对特定需求综…

Nginx 代理静态资源,解决跨域问题

😂 背景:移动端 H5 项目,依赖了一个外部的 JS 文件。访问时,出现跨域,导致请求被 block。 当前域名:https://tmcopss.test.com要访问的 JS 文件:https://tm.test.com/public/scripts/y-jssdk.j…

漏洞复现-海康威视网络对讲广播系统远程命令执行漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

基于Java (spring-boot)的在线培训考试系统

一、项目介绍 在线培训系统是一款基于SpringBootVue开发的考试系统。一款多角色在线培训考试系统,系统集成了用户管理、角色管理、部门管理、题库管理、试题管理、试题导入导出、考试管理、在线考试、错题训练等功能,考试流程完善。 多角色:多…

SQL基础知识(一)

SQL 是一种非常常见的用于管理关系型数据库的语言。下面是一些最常见的 SQL 语句: SELECT: 用于从数据库中选择数据。 例子: SELECT column1, column2 FROM table_name;这将选择 table_name 中的 column1 和 column2。 如果你想选择所有列,可以使用 …

基于蝴蝶算法优化的Elman神经网络数据预测 - 附代码

基于蝴蝶算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于蝴蝶算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于蝴蝶优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要:针…

【DOCKER】详细介绍以及如何创建管理DOCKER

介绍 Docker 什么是 Docker?简要介绍 Docker 的定义和基本概念。Docker 的优势和应用场景。为什么 Docker 在软件开发和部署中如此受欢迎? Docker 的核心概念 Docker 镜像:什么是 Docker 镜像?如何创建和管理 Docker 镜像&#xf…

100天精通Python(实用脚本篇)——第111天:批量将PDF转Word文档(附上脚本代码)

文章目录 专栏导读1. 将PDF转Word文档需求2. 模块安装3. 模块介绍4. 注意事项5. 完整代码实现6. 运行结果书籍推荐 专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教…

前端Vue日常工作中--Vue路由相关

前端Vue日常工作中–Vue路由相关 文章目录 前端Vue日常工作中--Vue路由相关1.路由模式2.router和$route3.路由跳转4.路由守卫5.路由传参6.问题:Vue路由解决页面刷新参数丢失的问题 1.路由模式 Vue 路由模式主要有两种:哈希模式(Hash Mode&am…

GRU算法

前置知识:RNN,LSTM LSTM需要训练的参数很多,极消耗计算资源。GRU是一种LSTM的改进算法,参数更少,更容易训练。 它将忘记门和输入门合并成为一个单一的更新门,同时合并了数据单元状态和隐藏状态&#xff0…

CSS 缩减顶部动画

<template><!-- mouseenter"startAnimation" 表示在鼠标进入元素时触发 startAnimation 方法。mouseleave"stopAnimation" 表示在鼠标离开元素时触发 stopAnimation 方法。 --><!-- 容器元素 --><div class"container" mou…