使用VGG网络训练发生错误RuntimeError: CUDA out of memory解决方案:

news2024/11/27 23:44:34

问题

在使用VGG网络训练Mnisist数据集时,发生错误RuntimeError: CUDA out of memory. Tried to allocate 392.00 MiB (GPU 0; 2.00 GiB total capacity; 1.45 GiB already allocated; 0 bytes free; 1.47 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF。

网络

class VGG(nn.Module):  # 适用于(128,3,224,224)
def __init__(self):
super().__init__()
self.net = nn.Sequential(
           nn.Conv2d(in_channels=1, out_channels=64, kernel_size=3, stride=1, padding=1),
           nn.ReLU(inplace=True),
           nn.MaxPool2d(2),
           nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1),
           nn.MaxPool2d(2),
           nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1),
           nn.MaxPool2d(2),
           nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, stride=1, padding=1),
           nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
           nn.MaxPool2d(2),
           nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
           nn.MaxPool2d(2),
           nn.Flatten(),
           nn.Linear(in_features=512 * 7 * 7, out_features=4096),
           nn.Linear(in_features=4096, out_features=4096),
           nn.Linear(in_features=4096, out_features=1000),
           nn.Linear(in_features=1000, out_features=10),

       )

def forward(self, x):
       out = self.net(x)
return out

报错截图:

c266b0b82f886fe7993819d67290a1a8.png


方法

尝试1 关闭显卡占用

根据报错(CUDA out of memory.),说明显卡内存不够。于是进入终端查一下memory现在的状态。没有在运行的进程,运行程序错误仍然存在。

f901c3c2a03c5f2c0a2a9c7015f169fa.png


尝试2 定时清理内存

在每个训练周期处插入以下代码(定时清内存):

import torch, gc

for epoch in range(100):

...............

gc.collect()

torch.cuda.empty_cache()

尝试3 设置锁页内存pin_memory

pin_memory就是锁页内存,创建DataLoader时,设置pin_memory=True,则意味着生成的Tensor数据最开始是属于内存中的锁页内存,这样将内存的Tensor转义到GPU的显存就会更快一些。

主机中的内存,有两种存在方式,一是锁页,二是不锁页,锁页内存存放的内容在任何情况下都不会与主机的虚拟内存进行交换(注:虚拟内存就是硬盘),而不锁页内存在主机内存不足时,数据会存放在虚拟内存中。显卡中的显存全部是锁页内存,当计算机的内存充足的时候,可以设置pin_memory=True。当系统卡住,或者交换内存使用过多的时候,设置pin_memory=False。因为pin_memory与电脑硬件性能有关,pytorch开发者不能确保每一个人都有高端设备,因此pin_memory默认为False。

尝试4 修改batch_size (问题解决)

最简单最直接的方法就是修改batch_size的大小,从而降低对显卡内存的占用。当将batch_size=4时,程序成功运行。

总结

当网路变得复杂的时候,对计算机硬件资源的要求也会随之变高。在本实验之中,就出现了因为VGG网络模型较为复杂,对计算机GPU的资源要求和消耗也随之变大,于是便出现了CUDA out of memory.GPU内存不够而报错的情况。在计算机硬件资源有限的情况下,只有选择降低batch_size的大小,从而达到计算机处理数据的能力之类。但是当batch_size过低训练出来的模型也会因为实际模型的需求出现一定的问题。简而言之batch size过小,需要花费更多时间,同时梯度震荡严重,不利于收敛;batch size过大,不同batch的梯度方向没有任何变化,容易陷入局部极小值。

这里提供一个免费使用高性能GPU的路径,在计算机资源有限前提下,如果能够使用上Google服务器可以将代码上传到Google Calab(Google colab是一个免费的 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行。并且可以免费使用Google的GPU)训练,再将训练好结果下载。

0d09f37d4d3b86c09228a5bf82259b75.png

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

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

相关文章

发布详解 | Flutter 3.7 稳定版发布

新年伊始,由 Flutter 3.7 正式版来「打头阵」!我们与整个 Flutter 社区成员们继续在 Flutter 3.7 中优化了框架,包括创建自定义菜单栏和层叠式菜单、更好的国际化工具支持、新的调试工具以及其他功能和特性等。新的稳定版里,我们在…

JUC面试(十二)——AQS

AQS juc.locks包下 AbstractQueuedSynchronizer,抽象的队列同步器 aqs是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石, 通过内置的FIFO队列来完成资源获取线程的排队工作,并通过一个int类变量表示持有锁的状态&#x…

极限运算法则——“高等数学”

各位CSDN的uu们你们好啊,今天,小雅兰学习的内容是极限运算法则 回顾 无穷小的极限运算法则 定理1:两个无穷小的和是无穷小 定理2:有界函数与无穷小的乘积是无穷小 极限的四则运算法则 定理3 定理4 定理5:极限的保序性…

实现自己的数据库二

一 前言上次数据库支持了一个测试表的插入和查询,但是数据全部保存到磁盘中的,如果程序重启后,数据都会全部丢了,所以需要持久化到磁盘上,像sqlite一样,简单的将数据库的数据保存到一个磁盘文件上。二 实现…

【BBuf的CUDA笔记】六,总结 FasterTransformer Encoder(BERT) 的cuda相关优化技巧

这里总结 FasterTransformer Encoder(BERT) 的cuda相关优化技巧 解读:https://github.com/NVIDIA/FasterTransformer/blob/main/docs/bert_guide.md ,优化点解读之前是翻译了下 Faster Transformer BERT 的文档,然后省略了运行样例等环节&…

【Datewhale一起吃瓜 Task4】啃瓜第五章

支持向量机 任务:找到超平面 在样本空间中,找到最好的超平面把样本分开,即找到正中间的超平面 满足 该超平面 分开了两类该超平面 最大化支持向量间隔该超平面处于 间隔中间,到所有支持向量距离相等 如何找:表示出…

从聚水潭到金蝶云星空通过接口集成数据

从聚水潭到金蝶云星空通过接口集成数据数据源系统:聚水潭聚水潭成立于2014年,创始人兼CEO骆海东拥有近三十年传统及电商ERP的研发和实施部署经验。聚水潭创建之初,以电商SaaSERP切入市场,凭借出色的产品和服务,快速获得市场的肯定…

【论文简述】Attention-Aware Multi-View Stereo(CVPR 2020)

一、论文简述 1. 第一作者:Keyang Luo 2. 发表年份:2020 3. 发表期刊:CVPR 4. 关键词:MVS、代价体、注意力机制、正则化 5. 探索动机: However, the feature matching results from different channels are usual…

仿写Dubbo-MyRpc

基础 在仿写Dubbo之前,需要了解一些技术,像Java反射,Java代理,Java Socket以及Dubbo相关概念。 项目结构 项目gitee地址:https://gitee.com/AGi_R/framework my-common 整个项目的公共资源库。存放一些公共的注解&…

拦截器、过滤器、监听器

目录一、拦截器1. 拦截器是什么?2. 设置拦截器a. 定义拦截器b. 配置加载拦截器c. 新建页面二、过滤器1. 使用原因2. Filter概念图3. Filter编程三、监听器一、拦截器 拦截器:必须保证页面有访问controller的操作,否则拦截不了 1. 拦截器是什么? 概念…

OpenWrt软路由空间扩容

文章目录预备知识OpenWrt系统固件分类EXT4固件扩容方式新建分区扩容操作步骤直接扩容操作步骤SQUASHFS固件扩容方式新建分区扩容直接扩容EFI引导固件的额外操作参考预备知识 OpenWrt系统固件分类 EXT4固件 固件包名称中包含有ext4关键字,可以参考固件分类关键字示意…

设计模式 - 创建型模式_建造者模式

文章目录创建型模式概述Case模拟工程Bad ImplBetter Impl (建造者模式重构代码)小结创建型模式 创建型模式提供创建对象的机制, 能够提升已有代码的灵活性和可复⽤性。 类型实现要点工厂方法定义⼀个创建对象的接⼝,让其⼦类⾃⼰…

编写用户注册用表单

<!-- 需求&#xff1a; 用户注册&#xff1a;用户名、密码、确认密码、性别、兴趣爱好、学历、简介 --> <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>编写用户注册用表单<…

【Linux】Linux和Window下\r与\n的区别、git命令行的使用

作者&#xff1a;小卢 专栏&#xff1a;《Linux》、《Git》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 1. 回车换行符在Window下和在Linux下的区别&#xff1a; 1.1回车换行符&#xff1a;…

用友U8和旺店通企业版淘宝奇门单据接口集成

用友U8和旺店通企业奇门单据接口集成对接系统&#xff1a;旺店通企业奇门慧策最先以旺店通ERP切入商家核心管理痛点——订单管理&#xff0c;之后围绕电商经营管理中的核心管理诉求&#xff0c;先后布局流量获取、会员管理、仓库管理等其他重要经营模块。慧策的产品线从旺店通E…

实现宏offsetof()

本期介绍&#x1f356; 主要介绍&#xff1a;什么是offsetof()&#xff0c;offsetof()的用法&#xff0c;如何自己实现这个宏&#x1f440;。 offsetof其实是一个宏&#xff0c;作用是&#xff1a;能够求出指定成员相对于结构体起始地址的偏移量&#xff08;单位&#xff1a;字…

(考研湖科大教书匠计算机网络)第三章数据链路层-第一节:数据链路层概述

文章目录一&#xff1a;数据链路层概述&#xff08;1&#xff09;为什么要有数据链路层&#xff08;2&#xff09;数据链路层定义&#xff08;3&#xff09;点对点信道和广播信道二&#xff1a;数据链路层需要解决的一些问题&#xff08;1&#xff09;三个最基本问题①&#xf…

深入理解Promise之一步步教你手写Promise构造函数

目录前言一&#xff0c;手写教学1.1 基本结构1.2 resolve与reject结构搭建1.3 resolve与reject代码实现1.4 throw抛出异常改变状态1.5 promise对象状态只能转换一次1.6 then方法进行回调1.7 异步任务的回调执行1.8 执行多个回调的实现1.9 同步修改状态then方法结果返回1.10 异步…

【手写 Promise 源码】第四篇 - 翻译并理解 Promise A+ 规范

一&#xff0c;前言 上一篇&#xff0c;根据对 Promise 的分析和了解&#xff0c;实现了一个简版 Promise&#xff0c;主要涉及以下内容&#xff1a; Promise 的实现思路&#xff1b;Promise A 规范&#xff08;简版&#xff09;&#xff1b;Promise 简版实现和功能测试&…

KVM虚拟化之小型虚拟机kvmtool的使用记录

根据 kvmtool github仓库文档的描述&#xff0c;类似于QEMU&#xff0c;kvmtool是一个承载KVM Guest OS的 host os用户态虚拟机&#xff0c;作为一个纯的完全虚拟化的工具&#xff0c;它不需要修改guest os即可运行, 不过&#xff0c;由于KVM基于CPU的硬件虚拟化支持&#xff0…