数据放到GPU上,运行程序卡住检查方法

news2024/12/30 2:24:30

这个问题一定是要结合具体的代码,下面就自己遇到问题,询问chatGPT后发现问题所在的过程进行记录,当然绝大部分情况下都是batch_size设置太大了,显卡内存不足导致

部分重点代码:

'''
导入模型部分略
'''

#自定义数据集有关类
class MyDataset(Dataset):
    def __init__(self, data):
        self.data = np.array(data)
    def __len__(self):
        return len(self.data)
    def __getitem__(self, idx):
        data = self.data[idx]
        return data

#批量处理数据
#在批量处理数据时对输入数据进行统一的处理用于在批量处理数据时对输入数据进行统一的处理,常用于NLP任务中的数据整理,特别是在使用 PyTorch 的数据加载器时
def collate_fn(data):
    max_length = max([len(x) for x in data])
    #长度限制为 512,以便防止序列太长导致内存不足或者计算效率低下。通常是为了适应模型(例如 BERT)的输入长度限制
    max_length = min(512,max_length)
    #attention_mask: 存放注意力掩码,标识哪些位置是有效的输入,哪些是填充(padding)
    #input_ids: 存放每个输入序列(已做过截断或填充)的 token ID。
    #weight: 存放每个序列的权重信息,权重值根据序列长度条件决定。
    attention_mask,input_ids,weight =[], [], []
    for x in data:
        if len(x)>max_length:
            #截断方式:取前半部分的前 max_length // 2 个 token 和后半部分的后 max_length // 2 个 token。
            #这种截断方式保留了序列的开头和结尾,适用于场景中间内容可能不重要的情况
            x = x[:max_length//2] + x[len(x)-max_length//2:]
        #attention表示哪些token 是有效的(值为 1),哪些是填充的(值为 0)。有效部分根据序列长度 len(x) 生成 1,剩下的部分补齐 0
        attention = [1] * len(x) + [0] * (max_length - len(x))
        attention_mask.append(attention)
        if len(x) == 2:
            weight.append(0)
        else:
            weight.append(1)
        #将每个序列 x 填充到指定的最大长度 max_length
        #[0] * (max_length - len(x)) 创建一个长度为 max_length - len(x) 的列表,所有元素都是 0。0通常代表 padding token(填充标记)
        x = x + [0] * (max_length - len(x))#x是一个list
        input_ids.append(x)
    #list换为 PyTorch 的 tensor 格式,以便于后续在模型中进行批量计算。
    input_ids = torch.tensor(input_ids)
    attention_mask = torch.tensor(attention_mask)
    weight = torch.tensor(weight).unsqueeze(1)#unsqueeze(1),增加一个维度,变成形如 (batch_size, 1),符合后续使用需求

    return input_ids, attention_mask, weight

#加载数据
title_ids = np.load(os.path.join(data_dir,'title_ids.npy'),allow_pickle=True)
data_set = MyDataset(title_ids)
dataloader = DataLoader(data_set, batch_size=128, collate_fn=collate_fn, shuffle=False, pin_memory=True,num_workers=4)

'''
运行以下代码时程序卡住,但是不报错
'''
title_embeddings = []
for input_ids, attention_mask, weight in tqdm(dataloader):
    with torch.no_grad():
        with autocast():
            input_ids = input_ids.to(device)
            attention_mask = attention_mask.to(device)
            hidden = model(input_ids = input_ids,
                           attention_mask=attention_mask,
                          output_hidden_states=True,
                          ).hidden_states
            avg = (hidden[0]+hidden[-1])/2
            embeddings = avg*attention_mask.unsqueeze(-1)
            embeddings = embeddings.sum(1) / attention_mask.sum(1).unsqueeze(-1)
            embeddings = embeddings*weight.to(device)
    title_embeddings += embeddings.tolist()

1.首先觉得是dataloader出现问题

#迭代 DataLoader 对象来查看数据的实际内容
for batch in dataloader:
    input_ids, attention_mask, weight = batch
    print('input_ids:', input_ids)
    print('attention_mask:', attention_mask)
    print('weight:', weight)
    break  # 只查看第一个批次的数据

#使用 iter 函数查看部分数据
data_iter = iter(dataloader)
batch = next(data_iter)
print(batch)

 两种方式作用一样,但是仍然卡住,没有报任何错误

2.接着尝试改变DataLoader的参数

(1)num_workers 设置过大

如果 num_workers 较大,DataLoader 会创建多个子进程来并行加载数据。在某些环境限制较大的服务器上,多线程的数据加载可能会出现问题,导致进程阻塞或卡住。

解决方法:num_workers 设置为 0,以禁用多进程加载,使用单线程数据加载方式。

无效

(2)pin_memory 设置问题

pin_memory=True 会将数据拷贝到固定内存(pinned memory),有助于在 GPU 加速的场景中提高数据传输效率。但在某些系统中,它可能导致数据加载效率降低甚至卡住。

解决方法: 尝试将 pin_memory 设置为 False,尤其是在 CPU 上训练时,通常不需要固定内存。

仍然无效

3.检查自定义函数collate_fn 是否有问题

函数问题

如果使用了自定义的 collate_fn,它可能存在问题,比如在处理数据时某些数据格式不正确

验证函数功能正确:

sample_data = [dataloader.dataset[i] for i in range(10)]
processed_batch = collate_fn(sample_data)
print(processed_batch)

4.数据集太大或者存储问题

数据集非常大,加载数据时可能会耗费大量内存,导致系统负载过高或者卡住。

解决方法: 通过减少批次大小来减轻内存压力。

 最终还是发现是自己显卡内存过低,batch_size设置为128直接卡住,逐渐减小batch_size会出现OutOfMemoryError

ps:经验不足,刚开始没想到是显存问题

管理GPU内存的一些方法

1.处理数据时,设置合理的batch_size,尽可能填满显存

2.使用混合精度训练,不仅减少显存占用,还可以加快计算速度,比如卡住的程序一段中使用的with.autocast()

3.报错中有一个提示,当出现reserved memory>>allocated memory,设置max_split_size_mb 来减少内存碎片。

方法:在程序的最开头

import os
os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'max_split_size_mb:128'

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

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

相关文章

无人机 PX4 飞控 | EKF2简介与使用方法

无人机 PX4 飞控 | EKF2简介与使用方法 PX4 EKF2简介EKF 的启动ecl EKF 的优缺点缺点优点 运行单个EKF实例运行多个EKF实例 PX4 EKF2简介 PX4是一个流行的开源飞控系统,广泛用于无人机和其他自动驾驶飞行器。EKF2(Extended Kalman Filter 2)…

IEEE 802.11a OFDM系统的仿真(续)

(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真 刘学勇编著第九章内容,有兴趣的读者请阅读原书) clear all %%%%%%%参数设计部分%%%%%%%Nsp52;%系统子载波数(不包括直流载波) Nfft64;%FFT长度 Ncp16;…

ppt文档怎么转换成pdf?快来试试这几种转换方法!

ppt文档怎么转换成pdf?在日常工作与学习的广阔舞台上,PPT,这一演示文稿的常青树,无疑是表达创意、传递信息的重要工具,然而,正如每枚硬币都有其两面,PPT在带来便捷的同时,也显露出一…

js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】

js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】 描述 概述 在前端开发中,遇到TypeError: Cannot read properties of null (reading indexOf)这类错误并不罕见。这个错误通常表明你试图在一个null值上调用indexOf方法&#xff0c…

Linux基础---05输入输出重定向

一.输出重定向符号> 操作1 > 文件 :将操作1的结果覆盖到文件里,并且此文件之前的数据全部清空。 操作2 >>文件:将操作2的结果追加到文件里,原文件的内容不会被清空。 操作3 1>right.txt 2>wrong.txt:操作3的返…

C 盘突然爆满,罪魁祸首竟然是 ...... !

今天打开电脑的时候突然发现 C 盘进度条变红了,这很不正常! 做软件开发的应该都会经常在各种磁盘中查找文件和资料,也就会频繁打开 此电脑 窗口,因此即使不是刻意去观察各个磁盘的容量,也会时不时瞟一眼每个盘的占用条…

Java特殊文件xml—利用Dom4J解析xml文件(完整详解,附有代码+案例)

文章目录 三十.特殊文件30.1 xml概述30.1 xml文件30.2 Dom4J解析xml30.2.1 案列130.2.2 案例2 三十.特殊文件 30.1 xml概述 可扩展标记语言 可扩展:标签名字可以自己定义 优点:易于阅读,可以配置成组出现的数据 缺点:解析比较复…

对称矩阵的压缩存储

1.给自己出题:自己动手创造,画一个5行5列的对称矩阵 2.画图:按“行优先”压缩存储上述矩阵,画出一维数组的样子 3.简答:写出元素 i,j 与 数组下标之间的对应关系 4.画图:按“列优先”压缩存储上述矩阵&a…

盐湖卤水中提取铷、铯

盐湖卤水中提取铷、铯是一个复杂但具有重要意义的过程,因为铷、铯是稀有的金属元素,在高科技、航空航天、新能源等领域有广泛应用。以下是从盐湖卤水中提取铷、铯的详细分析:我国盐湖资源丰富,盐类资源总量约12000亿吨&#xff0c…

2024.9.12(k8s环境搭建2)

一、接9.11 19、部署calico的pod 4. 查看容器和节点状态 异常处理: 出现Init:0/3,查看node节点 /var/log/messages是否有除网络异常之外的报错信息 三台机器执行:(更新版本) yum list kernel yum update kernel reb…

i++与++i在for循环中效果一样?

首先说结果 是的,在Visual Studio 2022中,不同于直接printf,在for循环中的i与i是同样的效果(都当作了i) 这是编译器干的好事。 如图比对 i i 原因探寻 | i i的底层原理 找到一篇博客,我目前还看不太明…

关于Spring Cloud 表达式注入漏洞——分析复现

更多漏洞分析复现,可前往无问社区查看http://www.wwlib.cn/index.php/artread/artid/5175.html 一、漏洞成因 近期,Spring Cloud官方发布了一则安全公告,修复了一个Spring Cloud Function中的 SPEL表达式注入漏洞。该漏洞是由于Spring Clou…

123.rk3399 uboot(2017.09) 源码分析3(2024-09-12)

啃了几天initf_dm,发现啃不动啊,但是后面的函数比这个简单,要不先把简单的做了吧。 本文接上一篇https://blog.csdn.net/zhaozhi0810/article/details/142050827 一、c的入口 board_init_f 1.3.12 arch_cpu_init_dm(common/board_f.c&#…

AWS账号申请指南:必须绑定银行卡吗?

小伙伴们,大家好!今天九河云来和大家聊一聊一个常见的问题:申请AWS账号时,是否必须要绑定银行卡呢?相信很多小伙伴在注册AWS账号时都会遇到这个问题。为了帮助大家更好地了解这个过程,小编特意整理了一些信…

SprinBoot+Vue旅游景点管理系统设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…

模 板

导引: 模板是为了解决函数类型不同所重载,带来的麻烦简化。利用一个模板(示列)代码,让编译器编写出不同类型的代码,满足所需。 int swap(int &p1,int &p2) {int pp1;p1p2;p2p; } char swap(char …

优化安防视频监控的关键体验:视频质量诊断技术如何应用在监控系统中?

随着科技的不断进步,视频监控平台在公安、司法、教育、基础设施等众多领域得到了广泛应用。然而,视频图像的质量直接关系到监控系统的应用效果,是反映监控系统运维效果的重要指标之一。因此,视频监控平台需要配备一系列先进的视频…

基于剂型改良的复杂注射剂分析!

改良型新药在医药领域的重要性日益凸显,其中脂质体注射剂作为一类重要的改良型新药,因其独特的临床优势和技术创新,正受到行业的高度关注。本文基于药融咨询团队的深度分析报告,探讨脂质体注射剂的技术创新、市场前景以及在中国的…

动手学深度学习(三)深度学习计算

一、模型构造 1、继承Module类来构造模型来构造模型 class MLP(nn.Module):# 声明带有模型参数的层,这里声明了两个全连接层def __init__(self, **kwargs):# 调用MLP父类Block的构造函数来进行必要的初始化。这样在构造实例时还可以指定其他函数# 参数&#xff0c…

利用CubeMX复现正点原子TFTLCD驱动例程

来源:正点原子 FMC的工作原理暂时先欠着,先记录一下CRUD的过程。 第一步准备一个us级别延时函数,不会的参考拙作:STM32的定时器简介-CSDN博客 第二部开启FMC外设: ①进入 Pinout->FMC 配置栏,配置 …