博主电脑配置是AMD R5 3600,Nvidia RTX3060 12G,16G 3200MHz内存,训练数据集是自建数据集,大约1200张图片,3个检测目标。
训练YOLOv5-5.0版本的模型参数设置,模型是yolov5s,epoch 150(如果想要更好的mAP@0.5:0.95指标可以设置的更大,博主这个收敛的太快了就没设太多),batchsize 32或者64,imgsize 640,640,其他均为默认。
在最初训练模型的时候训练一次epoch大约需要3分钟,而且不管怎么设置参数,训练时间都不会改变太多,都在3分钟左右,博主期初是因为自己没用GPU跑,但是显存是实实在在的吃满了,但利率用始终在0%和4%之间波动,大多数还是在0%,博主百思不得其解,百度了许多方法都没有用,看了大部分博主的文章,然后看了看运行时候的内存,CPU和GPU,发现CPU使用率不高,但是内存和显存占用很高,那么也就排除了在用CPU跑模型的情况,思来想去大概是出在数据读取上。下面来介绍一些训练模型速度慢可能的原因和解决方法:
博主之前用的自己的GTX960m的确跑不起来,如果自己显卡太老,显存太低,要么降低batchsize和worker,还有imgsize,要么就换一张显卡。三个参数的设置在train.py的设置代码如图


这种情况也很好发现,只需要看看显存是否被占用或者有没有安装pytorch和cuda,可以用如下代码来查看是否装了pytorch和cuda,怎么安装很多博主已经介绍过了,随便一查一大堆。

import torch
print(torch.__version__)
torch.cuda.is_available()
上面代码结果如下图,说明正确安装CUDA和pytorch(记得要版本对应,不然会报错),最好把cudnn也装上。

如果是CPU在训练,可以设置下面的代码来更换GPU训练模型,default设置成你GPU的编号就行,单显卡就是0。

CPU瓶颈很好判断,那就是CPU占用率很高,同时GPU也在使用,这说明电脑CPU太差了。设置参数,尽量不让CPU占用率超过85%。
3.2 内存瓶颈
简单来说就是内存爆了,基本上不存在内存频率跟不上的,同样设置参数,内存占用也尽量不要超过85%-90%。
3.3 IO瓶颈
这种情况会复杂很多,这个IO可能是硬盘读到内存导致的,也有可能是从内存到GPU导致的,也有可能是读写记录的时候导致的,反正杂七杂八的,最难看出哪里出了问题。
对于以上三种瓶颈可以通过瓶颈测试工具来测试出来,具体方法下面的博客说的很清楚。
(24条消息) PyTorch消除训练瓶颈 提速技巧_*pprp*的博客-CSDN博客
对于前两种瓶颈,都可以通过设置batchsize,workers和imgsize来尝试解决,或者更换yolov5的模型,使用最小的yolov5s来训练,如果以上方法解决不了,建议更换硬件或者租用云服务器。对于第三种情况基本只能通过预读取数据和更换硬件来实现。
对,你没有看错,性能过剩也会导致Yolov5训练速度过慢,原因也很让人无语,在train.py中有这样一行代码,这行代码旨在将数据读到内存中进行缓存,这样就可以更快的存取数据。
这样读取数据就可以让正在工作的GPU计算完数据后不会因为硬盘读写太慢而等待数据读入,所以硬盘的读取很重要,训练过程中,数据首先从硬盘读入到内存,然后再从内存读取到CPU或者GPU,所以一块好的硬盘可以有效的加速模型的训练,特别是笔记本硬盘,笔记本硬盘读取速度很慢,建议把数据放入SSD中。那么问题来了,如果GPU计算速度超过了从硬盘读入内存,再从内存读入GPU的速度,并且硬盘的读取速度够快,会发生什么,这也是导致博主训练速度太慢的原因。
对于小批量数据(很多自建数据都是小批量数据),一两千张,检测目标数不多,模型不复杂的情况下,对于高端显卡或者专业图形卡都是小case,基本都用不到多少算力,GPU很快就计算完了一个batch的数据,这时候就要等待数据读入,如果硬盘读写够快,数据从硬盘读入内存,GPU再从内存读出,相较于直接从硬盘读入GPU,本来用作缓存的内存反而成了额外的开销,数据绕了远路,IO读取时间反而增大了。其实说白了还是IO问题造成的,只不过原因不是硬件太差。当然,以上内容是博主的猜测,仅供参考。
所以,对于拥有一个好的SSD,好显卡,内存和CPU性能好的计算机而言,在训练数据量小,模型不大的情况下,建议将cacheimages关掉,直接从硬盘读入GPU,将action='store_true'替换为action='store_false'即可,关掉之后博主一次epoch从3分钟变成了20s,提升巨大,而且训练结果没有改变。
大多数情况来说都是性能不足,存在瓶颈的情况,从而导致模型训练时间长,这也是深度学习中常有的事,但是在自己硬件条件好,数据量不大的情况下,模型训练仍然慢,就该考虑下是不是因为性能过剩,在数据存取上花了过多的时间造成的,这表现为内存和显存使用很大,但是CPU和GPU却不怎么占用。经过博主一些测试,博主发现不管有没有用缓存,内存和显存使用都很大,这应该是pytorch底层逻辑的关系,在用GPU跑模型的时候pytorch会自动把数据缓存到显存里,内存使用大小仅仅和batch_size有关。
值得一提的是,虽然训练速度大大增加,但是依然没有解决GPU占用率低的问题,虽然GPU占用率很低,但是不会存在一段时间为0的情况,博主推测,可能是因为数据量太小,所需要检测目标数不多造成计算量太小的原因。博主之前在用VOC2012数据集进行训练时,GPU占用率就不低,但是仍然只占用了30%-60%,不知道使用这种方法有没有效,因为学业问题只能先跑自己数据集,如果有时间博主会更新相关结论。
最后,博主计算机功底不算扎实,如果有问题,希望各位读者指正。
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)