paddlepaddle 的 CPU 和 GPU

news2024/11/25 2:19:25

想记录一下一个 bug 改了一上午改到最后发现并没有 bug 的 bug。

总结:

  • 因为下午要跑很久,为了省 GPU 算力,我想上午先用 CPU 把数据处理部分跑出来(感觉数据处理部分不像网络训练那样涉及太多计算,所以感觉用 CPU 就可以了)。
  • 结果因为没用 GPU 导致计算量太大程序阻塞没有输出,用了一上午改了一个不是 bug 的 bug。

故事拉开序幕

当我运行:

# generate train data 
!python3.7 generate_feature.py -m train 
# generate validation data 
!python3.7 generate_feature.py -m valid

输出是这样的:

!!!! mode_type: train !!!!
idx_path:./index/fold0_train_idx.npy
fold_name: _fold0

!!!! mode_type: valid !!!!
idx_path:./index/fold0_valid_idx.npy
fold_name: _fold0
=========>>mode:valid    JA finished!!! <<=========
=========>>mode:valid    J finished!!! <<=========
=========>>mode:valid    BA finished!!! <<=========
=========>>mode:valid    B finished!!! <<=========
=========>>mode:valid    JB finished!!! <<=========
=========>>mode:valid    JMj finished!!! <<=========
=========>>mode:valid    Mb finished!!! <<=========
  • 可以看到输出,只生成了 valid 的数据 JA,J,BA 等,没有生成 train 的数据?
  • 这两个 mode (train or valid)都是调用下面的这个 gen_train_valid 函数,是同一个函数呀,这是为什么呢?
def gen_train_valid(mode):
    data_path = '/home/aistudio/data/data118104/train_data.npy'
    labels_path = '/home/aistudio/data/data118104/train_label.npy'
    data = np.load(data_path)[:, 0:2, :, :, :].astype('float32')
    labels = np.load(labels_path)
    for idx in range(5):
        idx_path = './index/fold{}_{}_idx.npy'.format(idx, mode)
        print('idx_path:{}'.format(idx_path))  # 打印路径看看 mode 对不对
        fold_idx = np.load(idx_path)
        data_fold = data[fold_idx]
        labels_fold = labels[fold_idx]
        fold_name = '_fold{}'.format(idx)
        print('fold_name: {}'.format(fold_name))  # 打印 fold_name
        JA = get_JA(data_fold, labels_fold, fold_name, mode)
        get_J(JA, fold_name, mode)
        get_BA(JA, fold_name, mode)
        B = get_B(JA, fold_name, mode)
        get_JB(JA, B, fold_name, mode)
        get_JMj(JA, fold_name, mode)
        get_Mb(B, fold_name, mode)

分析没有看到 train 相关的输出信息,可能的原因包括:

  • 输出信息被隐藏了;
  • 程序跑出了异常:检查程序是否报错,如果有错误信息请提供相关的报错信息以便进一步分析问题所在。
  • 训练集中没有数据:请您检查训练集中是否有数据,如果没有数据则会导致训练集特征无法生成。

可是再排查:

  • 输出信息没有被隐藏,因为 train文件夹中没有生成一个文件。
  • 于是我打印了 work/dataset/index/fold0_train_idx.npy 里的值,证明数据集中有数据;
  • 可是既然 valid 能正常输出,不是说明了程序没有问题吗?

没办法,我又检查了 generate_feature.py 脚本的源代码,然后把问题原因定位到 get_JA 函数,因为从这个函数开始 train 就没有输出了。

def get_JA(J, labels, fold_name, mode):
    N, C, T, V, M = J.shape
    save_data_path = './{}/JA{}.npy'.format(mode, fold_name)
    if mode != 'test':
        save_label_path = './{}/fold{}_label.npy'.format(mode, fold_name[-1])
    l = [pairs_local, pairs_center1, pairs_center2, pairs_hands, pairs_elbows, pairs_knees, pairs_feet]
    res = np.zeros((N, len(l), T, V, M), dtype='float32')
    for i, pairs in enumerate(l):
        ans = get_single_angle(pairs, J)
        res[:, i, :, :, :] = ans.squeeze(1)
    JA = np.concatenate((J , res), axis=1).astype('float32')
    if mode == 'train':
        JA, labels = upsampling(JA, labels)

然后我在这个函数里添加了很多 print 语句,发现问题出现在这3行:

    for i, pairs in enumerate(l):
        ans = get_single_angle(pairs, J)
        res[:, i, :, :, :] = ans.squeeze(1)

我又把 get_single_angle 函数单独调出来运行发现是可以正常输出的,输出的结果通过打印形状,也是符合预期的,不过我还是给这个函数加上了异常捕获;

加入异常捕获代码之后,程序不会直接退出,而是会在遇到异常时输出错误信息并返回 None。

为了检查输出是否被遗漏,我在循环结束后再添加一行 print(‘i: {}’.format(i)) 进行检查:

 for i, pairs in enumerate(l):
        print('i_start: {}'.format(i))
        ans = get_single_angle(pairs, J)
        print(ans.shape) # (2337, 1, 2500, 25, 1)
        res[:, i, :, :, :] = ans.squeeze(1)
        print(res.shape) # (2337, 7, 2500, 25, 1)
        print('i_end: {}'.format(i)) i_start: 0

发现没有 i_end 的输出。

结合问题:在 valid 模式下可以正常输出,但在 train 模式下没有输出。

可能是因为训练集数据量较大,在执行 get_JA 函数时需要处理的数据量很大,导致在输出语句之前程序被阻塞,无法顺利输出。

解决办法

解决办法:增加硬件资源。如果计算机性能较低,可以尝试增加硬件资源,例如更换更高配置的 CPU 或 GPU,以提高计算速度。

果然用了 GPU V100 32GB,输出就正常了。

i_end 正常输出了:

i_start: 0
(2337, 1, 2500, 25, 1)
(2337, 7, 2500, 25, 1)
i_end: 0

在这里插入图片描述

终于 train 也输出文件了:

在这里插入图片描述

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

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

相关文章

JavaWeb开发 —— MyBatis动态SQL

目录 一、XML映射文件 1. 介绍 2. MyBatisX插件 二、MyBatis动态SQL 1. if 2. foreach 3. sql & include 一、XML映射文件 1. 介绍 ① XML映射文件的名称与Mapper接口名称一致&#xff0c;并且将XML映射文件和Mapper接口放置在相同包下&#xff08;同包同名…

【Java EE】-网络编程(三) TCP/IP协议详解

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 主要内容&#xff1a;应用层HTTP协议、DNS域名解析系统、传输层UDP协议&#xff0c;TCP协议。TCP协议的工作机制&#xff1a;确认应答、超时重传、连接管理、滑动窗口…

【Linux】MySQL高可用之读写分离监控实践

一、Mycat-web安装配置 1、Mycat节点安装zookeeper&#xff08;在mycat实现了读写分离上安装&#xff09; ① 解压zookeeper压缩包 tar -zxvf zookeeper-3.4.14.tar.gz -C /opt/② cd到cnf目录下将文件复制 ③ cd到bin目录下启动 ./zkServer.sh start2、Mycat节点安装mycat-we…

跨境卖家不可错过的2023开斋节选品和营销技巧,轻松拓展海外市场

开斋节是穆斯林世界最重要的节日之一&#xff0c;同时也是跨境电商一个非常重要的销售节点。在这个节日期间&#xff0c;跨境卖家可以通过合适的选品和营销策略吸引更多的消费者&#xff0c;提高销售额。本文将探讨2023年跨境卖家在开斋节期间如何做好选品和营销。 一、选品 1…

MySQL到ClickHouse数据同步方案对比

ClickHouse 在执行分析查询时的速度优势很好的弥补了 MySQL 的不足&#xff0c;但是对于很多开发者和DBA来说&#xff0c;如何将MySQL稳定、高效、简单的同步到 ClickHouse 却很困难。本文对比了 NineData、MaterializeMySQL&#xff08;ClickHouse自带&#xff09;、Bifrost 三…

下一代听歌识曲技术——从信号处理到深度学习

音乐丰富我们的生活&#xff1b;音乐传达人类的情感&#xff1b;音乐表达人类的艺术。人类文明的进程中离不开音乐这个载体&#xff0c;音乐也离不开人类的真情创作。在听到好听却没听过的歌曲时&#xff0c;如何快速准确得到该歌曲的歌名成为当务之急。LiveVideoStackCon 2022…

网页学习-小试牛刀

网页学习 一、 网页组成二、HTML认知2.1 结构2.2 常用标签2.3 列表标签2.4 表格标签2.5 表单标签2.6 语义化标签2.7 字符实体 三、CSS认知四、JS认知 一、 网页组成 分为三大部分&#xff1a;HTML、CSS和JavaScript。 HTML&#xff08;Hyper Text Markup Language&#xff0c…

根据端口号查询进程路径

研究背景&#xff1a; 在工作的时候&#xff0c;有时候我们会在服务器上部署很多API接口程式&#xff0c;每个程式都有不同的端口号&#xff0c;便于提供服务。当时间久了&#xff0c;我们需要对接口操作的时候&#xff0c;我们有可能会忘掉接口程式所在的路径&#xff0c;而只…

一文掌握如何使用Java操作文件与IO流

文章目录 1. 认识文件2. 文件的类型3. 操作文件3.1 属性3.2 构造方法3.3 常用方法 4. IO流4.1 字节流4.1.1 InputStream4.1.2 OutputStream4.1.3 flush刷新4.1.4 关闭文件close4.1.5 字节缓冲流 4.2 字符流4.2.1 Reader4.2.2 Writer4.2.3 Scanner4.2.4 字符缓冲流 5. 复制文件5…

C语言入门篇——语句篇

目录 1、空语句 2、表达式语句 3、复合语句 4、控制语句 4.1、C控制语句&#xff1a;循环 4.1.1、while 4.1.2、while里的break和continue 4.2.1、for 4.2.2、for里的break和continue 4.3.1、do while 4.3.2、do while里的break和continue 5、C控制语句&#xff1a…

Flink 实时数仓 (一) --------- 数据采集层

目录 一、数仓分层介绍二、实时需求概览三、统计架构分析四、日志数据采集1. 模拟日志生成器的使用2. 日志采集模块-本地测试3. 日志采集模块-打包单机部署 五、业务数据库数据采集1. MySQL 的准备2. 环境搭建3. 代码实现 六、Nginx 安装七、Maxwell 安装八、Canal 安装 一、数…

STM32 平衡小车之电机驱动

TB6612FNG简介 单片机引脚的电流一般只有几十个毫安&#xff0c;无法驱动电机&#xff0c;因此一般是通过单片机控制电机驱动芯片进而控制电机。TB6612是比较常用的电机驱动芯片之一。 TB6612FNG可以同时控制两个电机&#xff0c;工作电流1.2A&#xff0c;最大电流3.2A。 VM电…

通信方式基础知识

文章目录 前言一、分类方式1、串行通信和并行通信2、同步通信和异步通信3、单工、半双工、全双工通信 前言 南京的梧桐树可以鲨掉我的程度 一、分类方式 1、串行通信和并行通信 串行通信&#xff1a;按位顺序&#xff0c;占用引脚资源较少&#xff0c;速度较慢 并行通信&…

移除链表元素(链表篇)

给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 思路&#xff1a; ①直接使用原来的链表来进行删除操作。 ②设置一个虚拟头结点在进行删除操作 ①直接使用原来的链表…

【数据结构】- (带头结点)循环双向链表 - 详细实现思路及代码

目录 一、概述 二、循环双向链表 三、循环双向链表实现步骤  &#x1f4cc;3.1 C语言定义循环双向链表结点  &#x1f4cc;3.2 循环双向链表初始化  &#x1f4cc;3.3 循环双向链表插入数据  &#x1f4cc;3.4 循环双向链表删除数据  &#x1f4cc;3.5 循环双向链表查找数…

【python中的多线程了解一下?】

基本说明 线程&#xff08;Thread&#xff09;是操作系统进行调度的最小单位&#xff0c;是进程中的一个独立执行单元。线程与进程相比&#xff0c;具有更轻量级、更高效率、更易调度、共享资源等优点。 在传统的单核CPU中&#xff0c;操作系统通过时间片轮转算法将CPU的时间…

各种通讯总线的学习记要

一、在B站板道题看到一个比较好完视频&#xff08;爱上半导体&#xff09; 我觉得将232和485之前先将串口通信&#xff0c;因为它们都是串口通讯的变种。 串口通讯&#xff1a; 串口通讯我们约定好帧格式和波特率&#xff0c;通讯正常起始位为低开始&#xff0c;8位数据位&a…

【ABAQUS文档阅读笔记】关于体单元、壳单元、梁单元 、truss单元的总体认识

我的主页&#xff1a; 技术邻&#xff1a;小铭的ABAQUS学习的技术邻主页博客园 : HF_SO4的主页哔哩哔哩&#xff1a;小铭的ABAQUS学习的个人空间csdn&#xff1a;qgm1702 博客园文章链接&#xff1a; 学习笔记&#xff0c;from abaqus document “getting start with ABAQUS…

【代码随想录】刷题Day4

1.交换链表 24. 两两交换链表中的节点 前后指针实现 1.没有元素或者只有一个元素无意义 2.给出一个前驱prev&#xff0c;以及用来交换的两个节点cur和next 3.我当时是这么想的&#xff0c;如果两个指针一起动&#xff0c;那么就要用cur和next同时判断结束&#xff0c;也许这个…

C#基础学习--异常

目录 什么是异常 try语句 异常类 catch子句 catch子句段 finally块 为异常寻找处理程序 更进一步搜索 一般法则 抛出异常 不带异常对象的抛出 什么是异常 异常是程序运行时错误&#xff0c;它违反了系统约束或应用程序约束&#xff0c;或出现了在正常操作时未预料的情…