【报错解决】深度学习模型训练时cuda内存足够但测试时反而报错cuda out of memory

报错描述

报错的代码如下:

model = reader(config=args, encoder=encoder)#初始化模型
model.to('cuda')#把模型放到gpu上
model.load_state_dict(torch.load(join(args.checkpoint_path, 'best_ckpt_model1.pkl')))#加载模型参数
model = torch.nn.DataParallel(model)#并行化处理

具体的报错解决如下所示:

Traceback (most recent call last):File "run_cail.py", line 314, in <module>best_join_f1=train_epoch(Loader, model1, model2,best_join_f1=best_join_f1)File "run_cail.py", line 132, in train_epochtrain_bh(model1,model2, batch)File "run_cail.py", line 164, in train_bhtype_logits, qc_out, sp_logits, att = model1(batch)File "/root/miniconda3/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_implresult = self.forward(*input, **kwargs)File "/root/miniconda3/lib/python3.8/site-packages/torch/nn/parallel/data_parallel.py", line 159, in forwardreturn self.module(*inputs[0], **kwargs[0])File "/root/miniconda3/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_implresult = self.forward(*input, **kwargs)File "/root/EBF_Reader-master/EBF_Reader-master/EBF Reader/model/modeling.py", line 104, in forwardqc_out=add_word_emb_into_char_emb(qc_out,word_ids,word_embedding)File "/root/EBF_Reader-master/EBF_Reader-master/EBF Reader/model/modeling.py", line 24, in add_word_emb_into_char_embword_id=word_ids[id][j].item()
RuntimeError: CUDA error: device-side assert triggered
terminate called after throwing an instance of 'c10::Error'what():  CUDA error: device-side assert triggered
Exception raised from create_event_internal at /pytorch/c10/cuda/CUDACachingAllocator.cpp:687 (most recent call first):
frame #0: c10::Error::Error(c10::SourceLocation, std::string) + 0x42 (0x7f8c3e3298b2 in /root/miniconda3/lib/python3.8/site-packages/torch/lib/libc10.so)
frame #1: c10::cuda::CUDACachingAllocator::raw_delete(void*) + 0xad2 (0x7f8c3e57b952 in /root/miniconda3/lib/python3.8/site-packages/torch/lib/libc10_cuda.so)
frame #2: c10::TensorImpl::release_resources() + 0x4d (0x7f8c3e314b7d in /root/miniconda3/lib/python3.8/site-packages/torch/lib/libc10.so)
frame #3: <unknown function> + 0x5fa0a2 (0x7f8cd21fd0a2 in /root/miniconda3/lib/python3.8/site-packages/torch/lib/libtorch_python.so)
frame #4: <unknown function> + 0x5fa156 (0x7f8cd21fd156 in /root/miniconda3/lib/python3.8/site-packages/torch/lib/libtorch_python.so)
<omitting python frames>
frame #21: __libc_start_main + 0xe7 (0x7f8cfab0eb97 in /lib/x86_64-linux-gnu/libc.so.6)Fatal Python error: AbortedCurrent thread 0x00007f8cfbaae2c0 (most recent call first):
<no Python frame>
run_cail2020.sh: line 19:   891 Aborted                 (core dumped) python run_cail.py --name train_v1 --bert_model $bert_dir --data_dir data --val_dir data_2020 --batch_size 4 --eval_batch_size 4 --lr 3e-5 --seed 1 --k_v_dim 256 --att_back_lambda 3.0 --gradient_accumulation_steps 1 --pre_each_epc 5 --epc_start_pre 7 --epochs 10

报错原因

报错的原理,简单来说,就是:

        初始化模型后将模型直接放到gpu上,然后先将模型参数加载到gpu上然后再加载带参数的模型,这就导致gpu上加载了两次模型参数。而深度学习模型的参数量一般是比较庞大的,因此,这就可能会造成gpu内存不够,进而在测试时报cuda out of memory的错。

详细说,就是:

        torch.load(model_path,map_location)函数的第一个参数model_path是你保存的模型所在路径,第二个参数是用于控制将模型加载到什么位置,默认是加载到cuda:0即第一块gpu上,可以通过改变该参数的值来控制模型加载到哪里,例如,令map_location='cpu'即可令模型加载到cpu上。

        回来接着说原因,我上面的报错代码中只有第一个参数model_path,而没有设置map_location的值,所以其直接默认加载到gpu上。就是说,torch.load函数将模型参数加载到了gpu上,这是gpu上的第一份模型参数。而函数model.load_state_dict函数又将模型加载了一次,也就是gpu上出现了第二份模型参数,这就造成了重复,有可能会造成gpu内存不够而报错。

这下应该明白为什么会训练的时候cuda内存足够,而测试的时候cuda内存不够报错了吧,就是因为重复加载模型参数了。

解决办法

我几乎尝试了网上能找到的所有解决办法,都没有用,但是最后还是让我找到解决办法了哈哈,这里来记录一下,顺便也希望能帮助到遇到同样问题的友友们:)

将报错代码改成下面这个样子就可以成功运行了:

model = reader(config=args, encoder=encoder)
model.load_state_dict(torch.load(join(args.checkpoint_path,'best_ckpt_model1.pkl'),map_location='cpu'))
model.to('cuda')
model = torch.nn.DataParallel(model)

下面来详细解释一下原因,就是为什么这样做cuda内存就够了,不会报错了。

第一行代码初始化模型,在cpu上进行,第二行代码,首先torch.load函数将模型参数加载到cpu上,然后model.load_state_dict函数加载模型到cpu上,第三行代码直接将整个模型放到gpu上,避免了重复加载模型参数,节省了gpu内存,就不会再造成cuda内存不够而报错了,第四行代码是将模型进行并行化处理,也就是说,如果你有多块gpu的话,这行代码可以将模型复制到多块gpu上进行并行化计算,当然如果你只有一块gpu或只有cpu,加了这行代码也没什么影响,不会报错。


看到这里,你应该明白为什么会出现深度学习模型训练时cuda内存够但测试时cuda内存不够的问题了吧,也知道怎么解决了吧。如果有用的话,希望可以不吝啬地点赞收藏夹关注啊~

这里是希望你能越来越好的 小白冲鸭 ~~~

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

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

相关文章

c++调用动态库LNK2019无法解析的外部符号LNK1120无法解析的外部命令

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK1120 6 个无法解析的外部命令 ConsoleApplication1 D:\vs_qt_project\ConsoleApplication1\x64\Debug\ConsoleApplication1.exe 1 严重性 代码 说明 项目 文件 行 …

聊聊App在安卓设备中所使用的内存

文章用来记录及分享本人对安卓程序中内存使用的个人见解&#xff0c;如有不同见解 不吝赐教。 先简单浏览下面代码&#xff0c;看看对它们是否熟悉&#x1f447; val activityManager getSystemService(ACTIVITY_SERVICE) as ActivityManager// Java 堆内存信息val runtime R…

adb 脚本化Android系统截图和录屏

1、首先我们了解截图和录屏最基础的命令 手机录屏 adb shell screenrecord sdcard/Pictures/Screenshots/Record_xxx.mp4导出手机录屏 adb pull sdcard/Pictures/Screenshots/Record_xxx.mp4手机截屏 adb shell screencap /sdcard/Screenshots_xxx.png导出手机截屏 adb pu…

应用层——HTTP协议(自己实现一个http协议)——客户端(浏览器)的请求做反序列化和请求分析,然后创建http向响应结构

应用层&#xff1a;之前我们写的创建套接字&#xff0c;发送数据&#xff0c;序列化反序列化这些都是在写应用层 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层 之前的网络计算机是我们自定义的协议&#xff1a;传输的数据最终是什么样的结…

Gnu/Linux 系统编程 - 如何获取帮助及一个演示

Gnu/Linux 系统编程 - 如何获取帮助及一个演示 今天开始写 Gnu/Linux 环境下的系统编程&#xff0c;主要的用的语言是 C&#xff0c;主要是为了学习 C 语言&#xff0c;边学边写&#xff0c;这样的学习速度是比较快的。 今天就先介绍下如何在手头上没有任何资料的情况下&…

windows11搭建 stable-diffusion-webui

2024年5月22日23:46:57 建议电脑配置 电脑配置&#xff1a; Intel Core™ Ultra 5 125H 1.20 GHz 32.0 GB (31.6 GB 可用) 系统&#xff1a;windows11 注意&#xff1a;最好挂上外网&#xff0c;或者设置好访问github的dns&#xff0c;不然很可能失败 1&#xff0c;安装 An…

高级文件操作

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Python内置的os模块除了可以对目录进行操作&#xff0c;还可以对文件进行一些高级操作&#xff0c;具体函数如表4所示。 表4 os模块提供的与文件相…

vue3 项目目录使用文件夹和index.vue,与直接用直接用名字.vue的区别

在 Vue 3 项目中&#xff0c;使用文件夹加 index.vue 文件与直接使用组件名字命名的 .vue 文件都是常见的组织方式。两者各有优缺点&#xff0c;适用于不同的场景和需求。以下是对这两种方式的详细比较&#xff1a; 使用文件夹和 index.vue 文件 结构示例 src/ ├── compo…

【AI基础】第三步:纯天然保姆喂饭级-安装并运行chatglm2-6b

chatglm2构建时使用了RUST&#xff0c;所以在安装chatglm2之前&#xff0c;先安装RUST。 此系列文章列表&#xff1a; 【AI基础】第一步&#xff1a;安装python开发环境-windows篇_下载安装ai环境python-CSDN博客 【AI基础】第一步&#xff1a;安装python开发环境-conda篇_mini…

知识图谱的应用---智慧司法

文章目录 智慧司法典型应用 智慧司法 智慧司法是综合运用人工智能、大数据、互联网、物联网、云计算等信息技术手段&#xff0c;遵循司法公开、公平、公正的原则&#xff0c;与司法领域业务知识经验深度融合&#xff0c;使司法机关在审判、检查、侦查、监管职能各方面得到全面的…

Android14 WMS-Power键短按流程

目录 1. PhoneWindowManager#interceptKeyBeforeQueueing 2. PhoneWindowManager#handleKeyGesture 3. PhoneWindowManager#handleCameraGesture 4. SingleKeyGestureDetector#interceptKey 5. SingleKeyGestureDetector#interceptKeyUp 6. SingleKeyGestureDetector#Ke…

【数据结构】图论入门

引入 数据的逻辑结构&#xff1a; 集合&#xff1a;数据元素间除“同属于一个集合”外&#xff0c;无其他关系线性结构&#xff1a;一个对多个&#xff0c;例如&#xff1a;线性表、栈、队列树形结构&#xff1a;一个对多个&#xff0c;例如&#xff1a;树图形结构&#xff1…

「前端+鸿蒙」鸿蒙应用开发-搭建开发环境创建项目

快速体验鸿蒙应用开发&#xff0c;首先需要搭建开发环境和创建项目。 搭建开发环境 下载DevEco Studio&#xff1a; 访问华为开发者联盟官方网站下载DevEco Studio。DevEco Studio下载链接 安装DevEco Studio&#xff1a; 运行下载的安装程序&#xff0c;按照安装向导指引完成…

SpringBoot中的WebMvcConfigurationSupport和WebMvcConfigurer

在SpringBoot中可以通过以下两种方式来完成自定义WebMvc的配置&#xff1a; &#xff08;1&#xff09;继承WebMvcConfigurationSupport类 &#xff08;2&#xff09;实现WebMvcConfigurer接口 通过这两种方式完成的WebMvc配置存在差异&#xff0c;本文将对此作简单说明与区…

【Vue】单页应用程序介绍

通常基于Vue去开发一整个网站&#xff0c;开发出来的这整个网站应用&#xff0c;我们都会叫做单页应用程序 概念 单页应用程序&#xff1a;SPA【Single Page Application】是指所有的功能都在一个html页面上实现 我们可以将页面共用的部分封装成组件&#xff0c;底下要切换的也…

【copy_dwg_files.bat】

参考这段代码,实现copy_dwg_files的功能 好的,以下是参考你提供的代码来实现 copy_dwg_files.bat 的功能。这段代码将在当前目录及其所有子目录中查找 施工图 文件夹,并将该文件夹下的所有 .dwg 文件复制到同一目录下的 Calculate 文件夹中。如果 Calculate 文件夹不存在,…

工具-金舟投屏软件: 手机如何投屏到电脑上 / Wi-Fi / USB

金舟安卓/iOS苹果投屏-正版软件下载中心 方法一、金舟投屏软件-wifi 1.1、准备工作 确保苹果手机和Windows电脑都连接到同一个Wi-Fi网络。 在Windows电脑上安装并打开金舟投屏软件。 1.2、操作步骤 在金舟投屏软件上选择“苹果手机投屏”功能。 在苹果手机上下滑屏幕&am…

New Work-flow of Circuit Bootstrapping

参考文献&#xff1a; [CGGI17] Chillotti I, Gama N, Georgieva M, et al. Faster packed homomorphic operations and efficient circuit bootstrapping for TFHE. ASIACRYPT 2017 (1): 377-408.[CDKS21] Chen H, Dai W, Kim M, et al. Efficient homomorphic conversion be…

dots_image 增强图像中的圆点特征

dots_image 增强图像中的圆点特征 1. dot_image 有什么用途&#xff1f;2. 点状字符的特征增强3. Halcon代码 1. dot_image 有什么用途&#xff1f; Enhance circular dots in an image. 这个算子可以增强图像中的圆点特征&#xff0c;例如下面的例子。 2. 点状字符的特征增强…

忆恒创源国产系列新品 —— PBlaze7 7A40 取得 PCI-SIG 兼容性认证

在此前报道中&#xff0c;我们曾预告了忆恒创源国产系列 PCIe 5.0 SSD 新品 —— PBlaze7 7A40&#xff0c;今天&#xff0c;这款 SSD 已经顺利通过 PCI-SIG 的严格测试并出现在 Integrators List 集成商列表当中&#xff0c;标志着距离 PBlaze7 7A40 的正式发布又近了一步。 正…