精华内容
下载资源
问答
  • 在深度学习模型训练过程中,在服务器端或者本地pc端,输入nvidia-smi来观察显卡的GPU内存占用率(Memory-Usage),显卡的GPU利用率(GPU-util),然后采用top来查看CPU的线程数(PID数)和利用率(%CPU)。...

            在深度学习模型训练过程中,在服务器端或者本地pc端,输入nvidia-smi来观察显卡的GPU内存占用率Memory-Usage),显卡的GPU利用率GPU-util),然后采用top来查看CPU的线程数(PID数)和利用率(%CPU)。往往会发现很多问题,比如,GPU内存占用率低,显卡利用率低,CPU百分比低等等。接下来仔细分析这些问题和处理办法。

    (ps:对于如何在Intel CPU,ARM架构CPU,以及Jetson TensorRT上部署深度学习模型,以及部署遇到的速度问题,该如何解决。请查看我的另外一篇文章。如何定制化编译Pytorch,TensorFlow,使得CNN模型在CPU,GPU,ARM架构和X86架构,都能快速运行,需要对每一个平台,有针对性的调整。如何做到最大化加速深度学习在不同平台部署性能。请看我的这篇文章。)

    深度学习模型部署性能分析,Intel和ARM CPU上CNN计算速度差距分析。

    1. GPU内存占用率问题

            这往往是由于模型的大小以及batch size的大小,来影响这个指标。当你发下你的GPU占用率很小的时候,比如40%,70%,等等。此时,如果你的网络结构已经固定,此时只需要改变batch size的大小,就可以尽量利用完整个GPU的内存。GPU的内存占用率主要是模型的大小,包括网络的宽度,深度,参数量,中间每一层的缓存,都会在内存中开辟空间来进行保存,所以模型本身会占用很大一部分内存。其次是batch size的大小,也会占用影响内存占用率。batch size设置为128,与设置为256相比,内存占用率是接近于2倍关系。当你batch  size设置为128,占用率为40%的话,设置为256时,此时模型的占用率约等于80%,偏差不大。所以在模型结构固定的情况下,尽量将batch size设置大,充分利用GPU的内存。(GPU会很快的算完你给进去的数据,主要瓶颈在CPU的数据吞吐量上面。)

    2. GPU利用率问题

            这个是Volatile GPU-Util表示,当没有设置好CPU的线程数时,这个参数是在反复的跳动的,0%,20%,70%,95%,0%。这样停息1-2 秒然后又重复起来。其实是GPU在等待数据从CPU传输过来,当从总线传输到GPU之后,GPU逐渐起计算来,利用率会突然升高,但是GPU的算力很强大,0.5秒就基本能处理完数据,所以利用率接下来又会降下去,等待下一个batch的传入。因此,这个GPU利用率瓶颈在内存带宽和内存介质上以及CPU的性能上面。最好当然就是换更好的四代或者更强大的内存条,配合更好的CPU。

            另外的一个方法是,在PyTorch这个框架里面,数据加载Dataloader上做更改和优化,包括num_workers(线程数),pin_memory,会提升速度。解决好数据传输的带宽瓶颈和GPU的运算效率低的问题。在TensorFlow下面,也有这个加载数据的设置。

    torch.utils.data.DataLoader(image_datasets[x],
                                batch_size=batch_size, 
                                shuffle=True,
                                num_workers=8,
                                pin_memory=True)

            为了提高利用率,首先要将num_workers(线程数)设置得体,4,8,16是几个常选的几个参数。本人测试过,将num_workers设置的非常大,例如,24,32,等,其效率反而降低,因为模型需要将数据平均分配到几个子线程去进行预处理,分发等数据操作,设高了反而影响效率。当然,线程数设置为1,是单个CPU来进行数据的预处理和传输给GPU,效率也会低。其次,当你的服务器或者电脑的内存较大,性能较好的时候,建议打开pin_memory打开,就省掉了将数据从CPU传入到缓存RAM里面,再给传输到GPU上;为True时是直接映射到GPU的相关内存块上,省掉了一点数据传输时间。

    3. CPU的利用率问题

            很多人在模型训练过程中,不只是关注GPU的各种性能参数,往往还需要查看CPU处理的怎么样,利用的好不好。这一点至关重要。但是对于CPU,不能一味追求超高的占用率。如图所示,对于14339这个程序来说,其CPU占用率为2349%(我的服务器是32核的,所以最高为3200%)。这表明用了24核CPU来加载数据和做预处理和后处理等。其实主要的CPU花在加载传输数据上。此时,来测量数据加载的时间发现,即使CPU利用率如此之高,其实际数据加载时间是设置恰当的DataLoader的20倍以上,也就是说这种方法来加载数据慢20倍。当DataLoader的num_workers=0时,或者不设置这个参数,会出现这个情况。

    CPU利用率查看结果
    CPU利用率查看结果

            下图中可以看出,加载数据的实际是12.8s,模型GPU运算时间是0.16s,loss反传和更新时间是0.48s。此时,即使CPU为2349%,但模型的训练速度还是非常慢,而且,GPU大部分是时间是空闲等待状态。

    num_workers=0,模型每个阶段运行时间统计

            当我将num_workers=1时,出现的时间统计如下,load data time为6.3,数据加载效率提升1倍。且此时的CPU利用率为170%,用的CPU并不多,性能提升1倍。

    num_workers=1时,模型每个阶段运行时间统计

            此时,查看GPU的性能状态(我的模型是放在1,2,3号卡上训练),发现,虽然GPU(1,2,3)的内存利用率很高,基本上为98%,但是利用率为0%左右。表面此时网络在等待从CPU传输数据到GPU,此时CPU疯狂加载数据,而GPU处于空闲状态

    1,2,3号GPU的内存占用率和计算效率截图

            由此可见,CPU的利用率不一定最大才最好。

            对于这个问题,解决办法是,增加DataLoader这个num_wokers的个数,主要是增加子线程的个数,来分担主线程的数据处理压力,多线程协同处理数据和传输数据,不用放在一个线程里负责所有的预处理和传输任务。

            我将num_workers=8,16都能取得不错的效果。此时用top查看CPU和线程数,如果我设置为num_workers=8,线程数有了8个连续开辟的线程PID,且大家的占用率都在100%左右,这表明模型的CPU端,是较好的分配了任务,提升数据吞吐效率。效果如下图所示,CPU利用率很平均和高效,每个线程是发挥了最大的性能。

    num_workers=8时,CPU利用率和8个连续PID任务

            此时,在用nvidia-smi查看GPU的利用率,几块GPU都在满负荷,满GPU内存,满GPU利用率的处理模型,速度得到巨大提升。

    优化数据加载num_workers=8,和设置batch size的结果

            上图中可以看见,GPU的内存利用率最大化,此时是将batch size设置的较大,占满了GPU的内存,然后将num_workers=8,分配多个子线程,且设置pin_memory=True,直接映射数据到GPU的专用内存,减少数据传输时间。GPU和CPU的数据瓶颈得到解决。整体性能得到权衡。

            此时的运行时间在表中做了统计:

    处理时间统计
    处理阶段 时间
    数据加载 0.25s
    模型在GPU计算 0.21s
    loss反传,参数更新 0.43s

    4. 总结

            对上面的分析总结一下,第一是增加batch size,增加GPU的内存占用率,尽量用完内存,而不要剩一半,空的内存给另外的程序用,两个任务的效率都会非常低。第二,在数据加载时候,将num_workers线程数设置稍微大一点,推荐是8,16等,且开启pin_memory=True不要将整个任务放在主进程里面做,这样消耗CPU,且速度和性能极为低下。

                                                                                                                                                                         

                                                                                                                                                                         

                                                                                                                                                                         

            Supplementary:看到大家在评论回复的问题比较多,所以再加一些叙述!

            开这么多线程。第一个,查看你的数据的batch_size,batchsize小了,主CPU直接就加载,处理,而且没有分配到多GPU里面(如果你使用的是多GPU);如果是单GPU,那么就是CPU使劲读数据,加载数据,然后GPU一下就处理完了,你的模型应该是很小,或者模型的FLOPs很小。检查一下模型问题。还有就是,现在这个情况下,开8个线程和1个线程,没什么影响,你开一个num_workers都一样的。如果速度快,没必要分配到多个num_workers去。当数据量大的时候,num_workers设置大,会非常降低数据加载阶段的耗时。这个主要还是应该配合过程。

            在调试过程,命令:top     实时查看你的CPU的进程利用率,这个参数对应你的num_workers的设置;

            命令:   watch -n 0.5 nvidia-smi    每0.5秒刷新并显示显卡设置。

    实时查看你的GPU的使用情况,这是GPU的设置相关。这两个配合好。包括batch_size的设置。

                                                                                                                                                                    时间:2019年9月20日

    5. 再次补充内容

            有很多网友都在讨论一些问题,有时候,我们除了排查代码,每个模块的处理信息之外,其实还可以查一下,你的内存卡,是插到哪一块插槽的。这个插槽的位置,也非常影响代码在GPU上运行的效率。

            大家除了看我上面的一些小的建议之外,评论里面也有很多有用的信息。遇到各自问题的网友们,把他们的不同情况,都描述和讨论了一下,经过交流,大家给出了各自在训练中,CPU,GPU效率问题的一些新的发现和解决问题的方法。

            针对下面的问题,给出一点补充说明:

            问题1: CPU忙碌,GPU清闲。

     数据的预处理,和加载到GPU的内存里面,花费时间。平衡一下batch size, num_workers。

            问题2:CPU利用率低,GPU跑起来,利用率浮动,先增加,然后降低,然后等待,CPU也是浮动。

    • 2.1 下面是具体的步骤和对策:

    在pytorch训练模型时出现以下情况, 情况描述: 首先环境:2080Ti + I7-10700K, torch1.6, cuda10.2, 驱动440 参数设置:shuffle=True, num_workers=8, pin_memory=True; 现象1:该代码在另外一台电脑上,可以将GPU利用率稳定在96%左右 现象2:在个人电脑上,CPU利用率比较低,导致数据加载慢,GPU利用率浮动,训练慢约4倍;有意思的是,偶然开始训练时,CPU利用率高,可以让GPU跑起来,但仅仅几分钟,CPU利用率降下来就上不去了,又回到蜗牛速度。

    •  可以采用的方法:

    两边的配置都一样吗。另一台电脑和你的电脑。你看整体,好像设置配置有点不同。包括硬件,CPU的核,内存大小。你对比一下两台设备。这是第一个。第二个,还是代码里面的配置,代码的高效性。你一来,CPU利用率低,你看一下每一步,卡到哪里,哪里是瓶颈,什么步骤最耗时。都记录一下每一个大的步骤的耗时,然后在分析。测试了每一个大的过程的时间,可以看见,耗时在哪里。主要包括,加载数据,前向传播,反向更新,然后下一步。

    • 2.2 经过测试之后,第二次问题分析:

    经过测试,发现本机卡的地方在加载图像的地方,有时加载10kb左右的图像需要1s以上,导致整个batch数据加载慢!代码应该没有问题,因为在其他电脑能全速跑起来;硬件上,本机的GPU,CPU都强悍,环境上也看不出差距,唯一差在内存16G,其他测试电脑为32G,请问这种现象和内存直接关系大吗?

    • 情况分析

    最多可能就在这边。你可以直接测试batch size为1情况下的整个计算。或者将batch size 开到不同的设置下。看加载数据,计算之间的差值。最有可能就是在这个load data,读取数据这块。 电脑的运行内存16g 32g。其实都已经够了,然后加载到GPU上,GPU内存能放下,影响不大。所以估计是你的内存相对小了,导致的问题。试一下。

    • 2.3 问题定位,解决方法:
    • 这台电脑的内存条插的位置不对,4个插槽的主板,1根内存的时候应该插在第2个插槽(以cpu端参考起),而组装电脑的商家不专业,放在了第4个插槽上,影响性能,更换位置后,速度飞起来了!关于插槽详情,有遇到的朋友去网上收,一大堆!

            在自己电脑,或者自己配的主机上,跑GPU的时候,记得注意查看你自己的内存卡是插到哪一个槽上的。

            补充时间:2021年1月15日

    5.1 再次新补充一些内容

            有网友补充了一些在执行上面的问题中遇到的实际问题,附上他的解决方法。

            使用win 10修改num_workers后可能会报错Broken pipe。

    解决方法:1. 把代码放到if __name__ == "__main__":下运行;或者2.num_workers默认为0即可;或者3. 在Linux进行代码运行

            有一些内容需要说明:在Windows下面,设置num_threads,除了在做数据加载的时候,设置num_workers,还可以用torch.set_num_threads(4)多线程,单线程,都会用多个CPU核,跑多个CPU core的的。只是CPU利用率不高。你设置8线程,12线程,CPU会在每个核上,都进行分配,只是单核的占用率,不一样。即使设置2线程,在6核12线程的CPU,也会在每个核心上,分配计算资源的。只是单核分配的很少。

    5.2 关于加速CPU端训练的方法(无GPU)

            在单独的CPU上,做训练,或者做推理,intel CPU提供了OpenMP 和MKL-DNN的加速库。一般torch或者TensorFlow都做了这一块的优化。可以查看你的pytorch版本,是否支持。

    print(torch.get_num_threads())
    print(torch.__config__.parallel_info())
    
    print(*torch.__config__.show().split("\n"), sep="\n")
    
    
    os.environ["OMP_NUM_THREADS"]="8"  #设置OpenMP计算库的线程数
    os.environ["MKL_NUM_THREADS"]="8"  # 设置MKL-DNN CPU加速库的线程数。
    torch.set_num_threads(8)

    print(torch.get_num_threads())
    print(torch.__config__.parallel_info())

    print(*torch.__config__.show().split("\n"), sep="\n")


    os.environ["OMP_NUM_THREADS"]="8"  #设置OpenMP计算库的线程数
    os.environ["MKL_NUM_THREADS"]="8"  # 设置MKL-DNN CPU加速库的线程数。
    torch.set_num_threads(8)

            分析:

            上面这几个,都可以试一下。看你的pytorch版本,是否在编译之后,支持MKL-DNN加速。为了能控制你使用的线程数,set_num_threads(8) 这个线程数的多少,可以自己按照需求来设定。当你全力跑网络模型,当然设置大点。如果需要留一部分CPU性能来做其他的业务,4线程,6线程?都可以。自己试一试。配合着任务管理器或者htop top 在linux下实时查看CPU使用状态和设置多线程数量的关系。来定性的分配。

            print(torch.__config__.parallel_info()) , 这个函数,查看你的pytorch支持的intel加速库的信息。

            print(*torch.__config__.show().split("\n"), sep="\n") , 这个函数,查看你编译过程中的信息。

            实测结果:

            有没有OpenMP支持,速度影响不是太大。在1-2s内的影响。所采用的pytorch版本是否支持mkl-dnn不影响。在mac arm m1芯片下,开启mkl-dnn,速度比没有开启快4s。44s 与 48s的差别。我们的平台,都是支持mkl-dnn。没有mkl-dnn,速度比有mkl-dnn编译的模型,慢1.5倍左右。

            结论:

            mkl-dnn有无,对性能影响不是很大,1-2x的影响。如果你需要这点性能,那么就要重点检测,你的pytorch版本,是否在编译过程中,设置了use_mkl=on,use_mkldnn=on。大多数情况下,咱们安装的pytorch官方版本,都在build过程中,设置了开启mkl加速选项。这是intel Math Kernel  Library for Deep Neural Networks (Intel® MKL-DNN) 专门针对intel CPU做的CPU端深度学习加速库。

            arm平台下,有无OpenMP和mkl-dnn不确定,要查看这个pytorch是否对arm 这个架构有支持。nvidia的arm平台,jetson这一类的,nvidia自己做了重新编译的,都适配了arm的CPU。

    再提醒一下:以上设置,如果不进行设计,默认为0,会按照最大的性能,来运行。

            补充时间:2021年6月25日。ps:有任何性能加速上遇到的问题,欢迎提出,我经常会查看大家的问题,能回答的都会回答。

    对于如何在Intel CPU,ARM架构CPU,以及Jetson TensorRT上部署,以及部署遇到的速度问题,该如何解决。请查看我的另外一篇文章。

    深度学习模型部署性能分析,Intel和ARM CPU上CNN计算速度差距分析。

    展开全文
  • 自己写的监控linux的linux流量,cpu利用率,磁盘利用率,内存利用率。并以每天,每周,每年4种图片报表呈现,记录了最大值时间。具体步骤里面的文档有写
  • 计算cpu利用率和内存利用率

    万次阅读 2015-01-20 17:08:29
    在Linux下,CPU利用率分为用户态,系统态空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,空闲系统进程执行的时间,三者之就是CPU的总时间,当没有用户进程、系统进程等需要执行的时候,CPU就...
      
    
    Linux CPU、内存利用率--计算(二)
    当需要频繁地获取,可以选择这种方法。
    1、原理
    (1)   CPU利用率
    Linux下,CPU利用率分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间,三者之和就是CPU的总时间,当没有用户进程、系统进程等需要执行的时候,CPU就执行系统缺省的空闲进程。从平常的思维方式理解的话,CPU的利用率就是非空闲进程占用时间的比例,即CPU执行非空闲进程的时间 CPU总的执行时间。
    Linux系统中,CPU时间的分配信息保存在/proc/stat文件中,利用率的计算应该从这个文件中获取数据。文件的头几行记录了每个CPU的用户态,系统态,空闲态等状态下分配的时间片(单位是Jiffies),这些数据是从CPU加电到当前的累计值。常用的监控软件就是利用/proc/stat里面的这些数据来计算CPU的利用率的。
    不同版本的linux /proc/stat文件内容不一样,以Linux 2.6来说,/proc/stat文件的内容如下:
     
    cpu 2032004 102648 238344 167130733 758440 15159 17878 0
    cpu0 1022597 63462 141826 83528451 366530 9362 15386 0
    cpu1 1009407 39185 96518 83602282 391909 5796 2492 0
    intr 303194010 212852371 3 0 0 11 0 0 2 1 1 0 0 3 0 11097365 0 72615114 6628960 0 179 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    ctxt 236095529
    btime 1195210746
    processes 401389
    procs_running 1
    procs_blocked 0
     
    第一行的数值表示的是CPU总的使用情况,所以我们只要用第一行的数字计算就可以了。下表解析第一行各数值的含义:
    参数 解析(单位:jiffies
    user (2032004) 从系统启动开始累计到当前时刻,用户态的CPU时间,不包含 nice值为负进程。
    nice (102648) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间
    system (238344) 从系统启动开始累计到当前时刻,核心时间
    idle (167130733) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间
    iowait (758440) 从系统启动开始累计到当前时刻,硬盘IO等待时间
    irq (15159) 从系统启动开始累计到当前时刻,硬中断时间
    softirq (17878) 从系统启动开始累计到当前时刻,软中断时间
     
     
    因为/proc/stat中的数值都是从系统启动开始累计到当前时刻的积累值,所以需要在不同时间点t1t2取值进行比较运算,当两个时间点的间隔较短时,就可以把这个计算结果看作是CPU的即时利用率。
     
    CPU的即时利用率的计算公式:
    CPUt1t2时间段总的使用时间 = ( user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1)
    CPUt1t2时间段空闲使用时间 = (idle2 - idle1)
    CPUt1t2时间段即时利用率 =  1 - CPU空闲使用时间 / CPU总的使用时间
     
     
    2)内存利用率
    计算内存利用率需要从/proc/meminfo文件中取相应数据,文件内容如下:
    MemTotal:      1024008 kB
    MemFree:         18448 kB
    Buffers:         12664 kB
    Cached:         282500 kB
    SwapCached:        716 kB
    Active:         816124 kB
    Inactive:        52516 kB
    HighTotal:      122500 kB
    HighFree:          304 kB
     
    … …
     
    MemTotal数值表示内存总量,MemFree数值表示空余数量。
    所以内存的即时利用率计算公式
    (MemTotal - MemFree)/ MemTotal
     
     
    2、实现
     这个例子适合于linux内核是2.6版本。Linux的版本问题请参照Linux 下CPU、内存利用率--获取(一)
     

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;


    public class MonitorUsageThread extends Thread{
        
        
    private final int frequency;//MS
        private static final File memFile = new File("/proc/meminfo");
        
    private static final File statFile = new File("/proc/stat");
        
    private static BufferedReader brMem ;
        
    private static BufferedReader brStat ;
        
    private static InputStreamReader isr = null;
        
        
    private static float cpuUsage;
        
    private static float memUsage;
        
        
    private static boolean on = true;
        
    public MonitorUsageThread(int frequency){
            
    this.frequency = frequency;
        }

        
        
        
    public void run(){
            System.out.println(
    "MonitorUsageThread start run ..................... on: "+on);
            String str 
    = null;
            StringTokenizer tokenMem 
    = null;
            
    int memTotal = 0;
            
    int memFree = 0;
            
    int userStart,niceStart,sysStart,idleStart,iowaitStart,hardirpStart,softirpStart,userEnd,niceEnd,sysEnd,idleEnd,iowaitEnd,hardirpEnd,softirpEnd;
            
    try {
                isr 
    = new InputStreamReader(new FileInputStream(statFile));
                brStat 
    = new BufferedReader(isr);
                StringTokenizer tokenStat 
    = new StringTokenizer(brStat.readLine());
                tokenStat.nextToken();
                userStart 
    = Integer.parseInt(tokenStat.nextToken());
                niceStart 
    = Integer.parseInt(tokenStat.nextToken());
                sysStart 
    = Integer.parseInt(tokenStat.nextToken());
                idleStart 
    = Integer.parseInt(tokenStat.nextToken());
                iowaitStart 
    = Integer.parseInt(tokenStat.nextToken());
                hardirpStart 
    = Integer.parseInt(tokenStat.nextToken());
                softirpStart 
    = Integer.parseInt(tokenStat.nextToken());
                Thread.sleep(frequency);
                
    while(on){
                    isr 
    = new InputStreamReader(new FileInputStream(statFile));
                    brStat 
    = new BufferedReader(isr);
                    tokenStat 
    = new StringTokenizer(brStat.readLine());
                    tokenStat.nextToken();
                    userEnd 
    = Integer.parseInt(tokenStat.nextToken());
                    niceEnd 
    = Integer.parseInt(tokenStat.nextToken());
                    sysEnd 
    = Integer.parseInt(tokenStat.nextToken());
                    idleEnd 
    = Integer.parseInt(tokenStat.nextToken());
                    iowaitEnd 
    = Integer.parseInt(tokenStat.nextToken());
                    hardirpEnd 
    = Integer.parseInt(tokenStat.nextToken());
                    softirpEnd 
    = Integer.parseInt(tokenStat.nextToken());
                    

                    
    int CPUEnd = userEnd+niceEnd+sysEnd+idleEnd+iowaitEnd+hardirpEnd+softirpEnd;
                    
    int CPUStart = userStart+niceStart+sysStart+idleStart+iowaitStart+hardirpStart+softirpStart;
                    System.out.println(
    "idleEnd:"+idleEnd+" , idleStart:"+idleStart+"   ,CPUEnd:"+CPUEnd+" , CPUStart:"+CPUStart);
                    
                    cpuUsage 
    = 1- (float)(idleEnd - idleStart) / (float)(CPUEnd - CPUStart);// cpu usage

                    
    //Gets memory information
                    isr = new InputStreamReader(new FileInputStream(memFile));
                    brMem 
    = new BufferedReader(isr);
                    
                    str 
    = brMem.readLine();
                    tokenMem 
    = new StringTokenizer(str);
                    tokenMem.nextToken();
                    memTotal 
    = Integer.parseInt(tokenMem.nextToken());
                    
                    str 
    = brMem.readLine();
                    tokenMem 
    = new StringTokenizer(str);
                    tokenMem.nextToken();
                    memFree 
    = Integer.parseInt(tokenMem.nextToken());
                            
                    System.out.println(
    "MemTotal:"+memTotal+" , MemFree:"+memFree);
                    memUsage 
    = (float)(memTotal-memFree) / (float)memTotal;// memory usage 
                    
                    userStart 
    = userEnd;
                    niceStart 
    = niceEnd;
                    sysStart 
    = sysEnd;
                    idleStart 
    = idleEnd;
                    iowaitStart 
    = iowaitEnd;
                    hardirpStart 
    = hardirpEnd;
                    softirpStart 
    = softirpEnd;

                    System.out.println(
    "Rate of CPU usage is "+cpuUsage+" , and the memory's is "+memUsage+"  ");
                    Thread.sleep(frequency);
    //
                }

                    
                    
            }
     catch (IOException ioe) {
                System.out.println(ioe.getMessage());
            }
     catch (InterruptedException ie) {
                System.out.println(ie.getMessage());
            }
     finally{
                freeResource();
            }


        }

                  
        
        
    private static void freeResource(){
            
    try{
                
    if(isr!=null)
                    isr.close();
                
    if(brMem!=null)
                    brMem.close();
                
    if(brStat!=null)
                    brStat.close();
            }
    catch(IOException ioe){
                System.out.println(ioe.getMessage());
            }

        }

        
        
    public static float getCPUUsage(){
            
    return cpuUsage;
        }

        
        
        
    public static float getMemoryUsage(){
            
    return memUsage;
        }

        
        
    public static void stopMonitor(){
            on 
    = false;
            freeResource();
        }

        
        
        
        
    public static void main(String[] args){
            MonitorUsageThread thread 
    = new MonitorUsageThread(2000);
            thread.start();
            
    try{
                Thread.sleep(
    10000);//MS
            }
    catch(InterruptedException ie){
                ie.printStackTrace();
            }

            System.out.println();
            System.out.println(
    "-------------CPU usage: "+getCPUUsage());
            System.out.println(
    "-------------Memory usage: "+getMemoryUsage());
            
            
    try{
                Thread.sleep(
    5000);//MS
            }
    catch(InterruptedException ie){
                ie.printStackTrace();
            }

            System.out.println();
            System.out.println(
    "-------------CPU usage: "+getCPUUsage());
            System.out.println(
    "-------------Memory usage: "+getMemoryUsage());
            
            
            thread.stopMonitor();
            System.exit(
    0);
        }

        
    }


    展开全文
  • 神经网络的利用率和

    千次阅读 2018-11-14 20:36:16
    1. 神经网络的利用率 当一个CNN网络做forward时,对于硬件资源的利用情况,称之为利用率。 如何计算利用率? 计算网络的计算量,通常是乘累加的次数 测量网络运行耗时 乘累加次数除以耗时, 计算该网络的GFLOPS 用...

    1. 神经网络的利用率

    当一个CNN网络做forward时,对于硬件资源的利用情况,称之为利用率。

    如何计算利用率?

    • 计算网络的计算量,通常是乘累加的次数
    • 测量网络运行耗时
    • 乘累加次数除以耗时, 计算该网络的GFLOPS
    • 用计算的网络GFLOPS除以硬件资源的理论GFLOPS,即利用率

    2. GFLOPS

    全称:float operations per second,每秒可做浮点操作的数量。用来衡量硬件性能,等价于运算速度。该值越大,说明硬件性能越高,速度越快。量级通常在M(10e6),G(10e9),T(10e12)。例如:9.6 GFLOPS 表示每秒可做 9.6 G 次浮点操作。

    FLOPs:全称是float operations,浮点运算次数,等价于运算量。可用来衡量网络/模型的复杂度。该值越大,表示该网络的计算复杂度越高。

    3. 网络计算量

    网络前向计算时,卷积运算占据耗时90%以上。因此重点关注下如何计算卷积的运算量。

    为简化问题,以下讨论认为:卷积采用滑动窗口且,忽略非线性计算的开销。

    有卷积层的参数包括:输入 feature map 的 CinC_{in},宽 HinH_{in},高 WinW_{in} ,输出 feature map 的 CoutC_{out},宽 HoutH_{out},高 WoutW_{out} ,卷积核的尺寸 KK,卷积核通道等于 CinC_{in},卷积核个数等于 CoutC_{out}。则该卷积核与feature map做卷积的运算量为:

    FLOPs=(KKCin2+1)WoutHoutCout FLOPs = (K * K * C_{in} * 2 + 1 ) * W_{out} * H_{out} * C_{out}

    Wout=Win/stridew,Hout=Hin/strideh W_{out} = W_{in} / stride_w, H_{out} = H_{in} / stride_h

    其中的1表示偏置量。偏置值每个卷积核对应1个,共有 CoutC_{out} 个。(wx+b)

    将 FLOPS 除以 10e9 得到 GFLOPS。

    参考

    [1] 神经网络计算量FLOPs: https://blog.csdn.net/zhaoyin214/article/details/83616164
    [2] print_model_parm_flops: https://blog.csdn.net/junmuzi/article/details/83109660

    展开全文
  • 电压利用率

    千次阅读 2020-08-26 21:01:15
      对于电压利用率的几点理解:   一般我们所说的电压利用率是指逆变器输出线电压的基波幅值与直流母线电压之比值。   可以看出,电压利用率并不是一个恒定值,因为逆变器输出线电压的基波幅值是变化的。因此...

      对于电压利用率的几点理解:
      一般我们所说的电压利用率是指逆变器输出线电压的基波幅值与直流母线电压之比值。
      可以看出,电压利用率并不是一个恒定值,因为逆变器输出线电压的基波幅值是变化的。因此一般只讨论最高电压利用率。
      不同调制方式电压利用率不同。SPWM在调制度为1时,输出相电压的基波幅值为Ud/2Ud/2%,输出线电压的基波幅值为3(Ud/2)\sqrt3*(Ud/2),电压利用率仅为3/2=0.866\sqrt3/2=0.866。SVPWM相电压基波幅值最大可达Ud/3Ud/\sqrt3,线电压基波幅值最大为3(Ud/3)=Ud\sqrt3*(Ud/\sqrt3)=Ud,电压利用率为1。
      工程应用中关注的电压利用率还应该考虑死区、管压降、相线压降等因素。这个电压利用率有点类似于效率。

    展开全文
  • 利用率

    2020-03-03 17:27:30
    分为两种 信道利用率 有数据通过时间/(有+无)数据通过时间 网络利用率 信道利用率加权平均值 利用率越高 时延越大 性能指标
  • CPU利用率和Load Average的区别

    千次阅读 2016-06-01 14:16:54
    理解CPU利用率和load average的关系
  • 使用vshere Mangement SDK6.5 查询虚拟机CPU利用率和内存利用率public OssVm getVmByUuid(final String uuid, final String ip) throws Exception { final Connector conn = Connector.getConnector(ip); final ...
  • GPU动态显示利用率显存功率命令

    千次阅读 2019-04-22 20:56:38
    nvidia-smi:可以显示当前gpu利用率、显存功率 watch -n 0.1 nvidia-smi :可以动态显示gpu利用率、显存功率
  • TensorFlow如何提高GPU训练效率和利用率 9前言 首先,如果你现在已经很熟悉tf.data+estimator了,可以把文章x掉了╮( ̄▽ ̄””)╭ 但是!如果现在还是在进行session.run(..)的话!尤其是苦恼于GPU显存都塞满了...
  • 运行之前要先确保服务器已经配置好相关环境,然后可以输入命令nvidia-smi查看一下GPU的使用情况,下图输入命令后的结果,主要看内存利用率(第二列)GPU利用率(第三列),图中因为没有程序在运行,所以GPU的利用...
  • 进程cpu利用率

    2013-10-09 09:20:33
    snmp获取进程的cpu利用率内存利用率
  • 利用率计算软件

    2015-08-13 16:33:20
    PCB板板材利用率计算软件,可提高生产效率
  • 企业IT部门一直在寻求提高香港服务器效率的方法,最大限度地提高利用率以实现利益最大化。管理者在维护服务器安全性的同时提高效率的方式包括虚拟化、监控工具更新服务器。 一、虚拟化 如果您不想投资额外的服务器...
  • 基于生态平衡施肥理论通用施肥模型,以河南省小麦氮肥肥效试验数据为例,分别求算长期定位试验、普通田间试验、示踪试验三种情况下的肥料氮利用率和氮转化率,并进行评价,结果表明:①长期定位试验氮利用率和氮...
  • Ubuntu 右上角显示实时网速、CPU利用率、内存利用率 ​ 先来看下效果图: 想达到这样的效果,可以通过添加PPA安装: sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitor sudo apt-get update sudo...
  • 这篇博客会介绍如何通过JMX 来获取JAVA 进程占用的CPU利用率和GC所占用的CPU利用率在使用JVisualVM的时候,发现它可以查看当前JAVA 进程占用的CPU利用率和GC 所占用的CPU利用率,很奇怪它是如何计算的或者怎么获取的....
  • 获取CPU利用率

    2013-10-29 15:15:40
    教你如何利用VC获取CPU利用率,可以用于测试工控机性能,或者实现控制程序性能。
  • cpu利用率和cpu负载是什么?

    千次阅读 2018-09-22 18:53:23
    我们经常会听到要好好使用cpu的资源,提高cpu利用率,要学习应对高负载的情况,那这个高负载其实大多数情况指的就是cpu负载。我们还会学习到一个命令是top,这个命令可以得到他们的数值其他系统指标。那么什么是...
  • 本标准规定了通信网络设备再使用率、再生利用率、回收利用率、可再生利用率和可回收利用率的计算方法。本标准适用于通信网络设备。 window._bd_share_config =
  • 利用率统计工具

    2013-12-09 22:29:06
    利用率统计工具,用来统计上班、下班、加班工时等数据。
  • 动态显示CPU利用率

    2013-04-25 21:39:13
    动态显示CPU利用率,可以实时得到CPU利用率参数
  • GSM网络话务量分布特征无线信道利用率分析,唐碧霞,叶文,无线信道利用率是衡量网络容量无线资源利用率的一个重要性能指标,实际GSM网络评估载频优化配置需要准确可信的无线信道利用率
  • GPU利用率与使用率

    千次阅读 2019-02-28 14:52:28
    广义的GPU利用是指对GPU利用率效率,包括GPU空间时间上的利用效率。 狭义的GPU利用率是指GPU时间片上的利用率; GPU可用的物理资源有哪些? GPU可利用资源:SM (计算单元)MEM(存储) Encoder(编码) ...
  • Linux计算CPU利用率

    2012-11-29 16:18:35
    Linux计算CPU利用率
  • 巴鲁夫塑料、橡胶轮胎_卓越的精度和效率,确保出色的系统利用率pdf,
  • 巴鲁夫 塑料、橡胶轮胎(卓越的精度和效率,确保出色的系统利用率)zip,提供“巴鲁夫 塑料、橡胶轮胎(卓越的精度和效率,确保出色的系统利用率)”免费资料下载,主要包括产品技术参数、系统特点、选型、优势等...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 795,927
精华内容 318,370
关键字:

利用效率和利用率的差别