PyTorch Lightning教程六:优化代码
有时候模型训练很慢,代码写得冗长之后,没法诶个检查到底那块出现了占用了时空间,本节通过利用Lightning的一些方法,检查分析是那块代码出现了问题,从而来进一步指导和优化代码
本节主要基于性能分析方法,通过捕获分析信息(例如函数花费的时间或使用了多少内存)帮助我们找到代码中的瓶颈。
找到训练时候的瓶颈
最基本的性能分析配置文件,包含训练中Callback、DataModules和LightningModule中的所有关键方法。可以通过如下方法引入
trainer = Trainer(profiler="simple")
一旦执行.fit()方法,则可以看到如下类似结果
FIT Profiler Report
-----------------------------------------------------------------------------------------------
| Action | Mean duration (s) | Total time (s) |
-----------------------------------------------------------------------------------------------
| [LightningModule]BoringModel.prepare_data | 10.0001 | 20.00 |
| run_training_epoch | 6.1558 | 6.1558 |
| run_training_batch | 0.0022506 | 0.015754 |
| [LightningModule]BoringModel.optimizer_step | 0.0017477 | 0.012234 |
| [LightningModule]BoringModel.val_dataloader | 0.00024388 | 0.00024388 |
| on_train_batch_start | 0.00014637 | 0.0010246 |
| [LightningModule]BoringModel.teardown | 2.15e-06 | 2.15e-06 |
| [LightningModule]BoringModel.on_train_start | 1.644e-06 | 1.644e-06 |
| [LightningModule]BoringModel.on_train_end | 1.516e-06 | 1.516e-06 |
| [LightningModule]BoringModel.on_fit_end | 1.426e-06 | 1.426e-06 |
| [LightningModule]BoringModel.setup | 1.403e-06 | 1.403e-06 |
| [LightningModule]BoringModel.on_fit_start | 1.226e-06 | 1.226e-06 |
-----------------------------------------------------------------------------------------------
在这个打印出来的报告中,我们可以看到最慢的函数是prepare_data,现在我们可以弄清楚为什么数据准备会减慢训练速度。执行profiler="simple",会包括:
- on_train_epoch_start
- on_train_epoch_end
- on_train_batch_start
- model_backward
- on_after_backward
- optimizer_step
- on_train_batch_end
- on_training_end
- 等等……
分析每个函数内的时间
要分析每个函数花费的时间,使用构建在Python的cProfiler之上的AdvancedProfiler,如下引用:
trainer = Trainer(profiler="advanced")
执行fit后,会出现如下结果
Profiler ReportProfile stats for: get_train_batch4869394 function calls (4863767 primitive calls) in 18.893 seconds
Ordered by: cumulative time
List reduced from 76 to 10 due to restriction <10>
ncalls tottime percall cumtime percall filename:lineno(function)
3752/1876 0.011 0.000 18.887 0.010 {built-in method builtins.next}1876 0.008 0.000 18.877 0.010 dataloader.py:344(__next__)1876 0.074 0.000 18.869 0.010 dataloader.py:383(_next_data)1875 0.012 0.000 18.721 0.010 fetch.py:42(fetch)1875 0.084 0.000 18.290 0.010 fetch.py:44(<listcomp>)60000 1.759 0.000 18.206 0.000 mnist.py:80(__getitem__)60000 0.267 0.000 13.022 0.000 transforms.py:68(__call__)60000 0.182 0.000 7.020 0.000 transforms.py:93(__call__)60000 1.651 0.000 6.839 0.000 functional.py:42(to_tensor)60000 0.260 0.000 5.734 0.000 transforms.py:167(__call__)
如果分析器报告变得太长,可以将报告流式传输到一个文件:
from lightning.pytorch.profilers import AdvancedProfilerprofiler = AdvancedProfiler(dirpath=".", filename="perf_logs")
trainer = Trainer(profiler=profiler)
很方便!
分析加速器使用情况
另一种检测瓶颈的有用技术,是确保正在使用加速器(GPU/TPU/IPU/HPU)的全部容量。这可以用DeviceStatsMonitor来测量:
from lightning.pytorch.callbacks import DeviceStatsMonitortrainer = Trainer(callbacks=[DeviceStatsMonitor()])
CPU指标将在CPU加速器上默认跟踪。设置DeviceStatsMonitor(cpu_stats=True)为其他加速器启用它。要禁用记录CPU指标,可以指定DeviceStatsMonitor(cpu_stats=False)。
相关文章:
PyTorch Lightning教程六:优化代码
有时候模型训练很慢,代码写得冗长之后,没法诶个检查到底那块出现了占用了时空间,本节通过利用Lightning的一些方法,检查分析是那块代码出现了问题,从而来进一步指导和优化代码 本节主要基于性能分析方法,通…...
基于linux下的高并发服务器开发(第四章)- 多线程实现并发服务器
>>了解文件描述符 文件描述符分为两类,一类是用于监听的,一类是用于通信的,在服务器端既有监听的,又有通信的。而且在服务器端只有一个用于监听的文件描述符,用于通信的文件描述符是有n个。和多少个客户端建立了…...
YUV 色彩空间中U 和 V 分量的范围
在YUV色彩空间中,U分量和V分量的范围通常是-0.5到0.5。 具体来说,对于标准的YUV色彩空间(例如YUV420),取样是按照4:2:0的比例进行的。这意味着在水平和垂直方向上,U和V分量的取样比Y分量少一半。因此&…...
【云原生】K8S二进制搭建一
目录 一、环境部署1.1操作系统初始化 二、部署etcd集群2.1 准备签发证书环境在 master01 节点上操作在 node01与02 节点上操作 三、部署docker引擎四、部署 Master 组件4.1在 master01 节点上操 五、部署Worker Node组件 一、环境部署 集群IP组件k8s集群master01192.168.243.1…...
自动化应用杂志自动化应用杂志社自动化应用编辑部2023年第11期目录
数据处理与人工智能 大数据视域下无轨设备全生命周期健康管理技术的研究 赖凡; 1-3 三维激光扫描结合无人机倾斜摄影在街区改造测绘中的技术应用 张睿; 4-6 井上变电站巡检机器人的设计与应用 刘芳; 7-9 《自动化应用》投稿邮箱:cnqikantg126.com 基于机…...
Tensorflow2-初识
TensorFlow2是一个深度学习框架,可以理解为一个工具,有谷歌的全力支持,具有易用、灵活、可扩展、性能优越、良好的社区资源等优点。 1、环境的搭建 1.1 Anaconda3的安装 https://www.anaconda.com/ Python全家桶,包括Python环境和…...
idea-常用插件汇总
idea-常用插件汇总 码云插件 这个插件是码云提供的ps-码云是国内的一款类似github的代码托管工具。 Lombok Lombok是一个通用Java类库,能自动插入编辑器并构建工具,简化Java开发。通过添加注解的方式,不需要为类编写getter或setter等方法…...
【Kubernetes】
目录 一、Kubernetes 概述1、K8S 是什么?2、为什么要用 K8S?3、Kubernetes 集群架构与组件 二、核心组件1、Master 组件2、Node 组件3、K8S创建Pod的工作流程?(重点)4、K8S资源对象(重点)5、Kubernetes 核…...
使用逗号方式、JOIN方式和USING方式进行多表连接查询时哪个方式更好
在Oracle中,使用逗号方式、JOIN方式和USING方式进行多表连接查询时,性能上没有明显的差异。这是因为Oracle优化器会自动将这些语法转换为内部执行计划,以获得最佳的查询性能。 逗号方式:逗号方式是最简单的连接语法,它…...
MacOS上用docker运行mongo及mongo-express
MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 前提 要求…...
海康视频插件VideoWebPlugin在vue中的实现
一,将js文件放在public文件下 二,在index中全局引入 三.在视频页面写方法,创建实例,初始化,我写的是1*4屏的 <template><!--视频窗口展示--><div idplayWnd classNameplayWnd refplayWnd styleleft: 0; bottom: 0;height: 902px;width: 60vw></div>&…...
swagger相关问题
swagger相关问题 swagger版本为: <dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.6</version> </dependency> <dependency><groupId&…...
Scala关键字lazy的见解
Scala中使用关键字lazy来定义惰性变量,实现延迟加载(懒加载)。 惰性变量只能是不可变变量,并且只有在调用惰性变量时,才会去实例化这个变量。 在Java中,要实现延迟加载(懒加载),需要自己手动实现。一般的做法是这样的…...
sql分类 DDL、DML、DCL
DDL (Data Definition Language 数据定义语言) 这些语句定了不同的数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构 如: CREATE \ DROP \ ALTER \ RENAME \ TRUNCATE 等 DML(Data Manipulation Langua…...
C++ 性能优化
要系统地提升C项目的性能,可以采取以下步骤: 分析和度量:首先,你需要通过性能分析工具来确定项目中的性能瓶颈。使用工具如gprof、perf等,来识别代码中消耗时间和资源最多的部分。 选择合适的数据结构和算法ÿ…...
435. 无重叠区间
435. 无重叠区间 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 示例 1: 输入: intervals [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释: 移除 [1,3] 后,剩下的区间…...
winform使用SetParent 嵌入excel,打开的excel跟随dpi 25%*125%缩放了两次,目前微软官方没有好的解决方案,为什么
双重缩放问题在将 Excel 嵌入到 WinForm 中时确实可能会出现,这是因为两个不同的应用程序(WinForm 和 Excel)之间的 DPI 缩放逻辑不一致,导致双重缩放的结果。 在 Windows 操作系统中,DPI 缩放是一种全局的设置&#…...
MySQL 数据库、表的基本操作
目录 数据库 关系数据库SQL 关系数据库常用词汇 常用命令语句 数据库操作 查看数据库 创建数据库 修改数据库编码 删除数据库 数据表操作 查看数据表 创建数据表 表中数据操作 增 删 改 查 数据库 数据库是在数据管理和程序开发过程中,一种非常重要…...
html5播放器视频切换和连续播放的实例
当前播放器实例可以使用changeVid接口切换正在播放的视频。当有多个视频,在上一个视频播放完毕时,自动播放下一个视频时也可采用该处理方式。 const option {vid: 88083abbf5bcf1356e05d39666be527a_8,//autoplay: true,//playsafe: , //PC端播放加密视…...
什么是无服务器架构技术
什么是无服务器架构技术 无服务器架构(Serverless Architecture)是jin年来逐渐兴起的一种软件架构方案,它采用了一种全新的方式来处理应用程序的部署、运行和扩展。与传统的服务器架构相比,无服务器架构具有很多优势,包…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
