PixInsight算命会不会越算越不好调用GPU算力


现在的GPU的集成度、设计的

GPU也能通過软件运行一些CPU的工

按现在的形势看个人认为,日后GPU是不会取代CPU来做电脑核心而是GPU与CPU整合在一起,而电脑的其他配件的集成度也会越來越高或许以后的台式机主机只有现在的笔记本大小

你对这个回答的评价是?


两者的侧重点不同GPU针对的是图像,CPU针对的是数据两者鈈好做比较,如果非要比的话GPU要强于CPU

你对这个回答的评价是?

本回答由思腾合力(天津)科技有限公司提供

然脱离不了CPU对他的

位CPU计算量在系统中要大于显卡。显卡从原来的处理图像也变得可以处理一些特定程序在运行专业领域的软件时,GPU的计算量大于CPU

单纯拼运算速度嘚话GPU远远大于CPU,但是显卡的运行要在CPU的控制下进行如果没有了CPU显卡也不能自主运算,等于0

你对这个回答的评价是


,理论上GPU比CPU运算

电腦的其他配件的集成度也会越来越高GPU也能通过软件运行一些CPU的工作。

两者的侧重点不同GPU针对的是图像,CPU针对的是数据两者不好做比較,如果非要比的话GPU要强于CPU。

你对这个回答的评价是


目前来说是CPU,但是日后GPU会取代CPU来做电脑核心,毕竟科技日渐发达嘛

你对这个回答的评價是?

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。


首先如果你现在已经很熟悉tf.data+estimator了,可以把文章x掉了╮( ̄▽ ̄””)╭
但是!如果现在还是在进行session.run(…)的话!尤其是苦恼于GPU显存都塞满了利用率却上不去的童鞋这篇文章或许鈳以给你打开新世界的大门噢( ̄? ̄)
如果发现经过一系列改良后训练效率大大提高了,记得回来给小夕发小红包( ̄? ̄)
不过这并不是一篇怒贴一堆代码,言(三)简(言)意(两)赅(语)就结束的CSDN文风的文章。所以伸手党们也可以X掉了╮( ̄▽ ̄””)╭
很早很早之前,在小夕刚接触tensorflow和使用GPU加速计算的时候就产生过一个疑惑。为什么显卡的显存都快满了GPU利用率还显示这么低呢?好浪费呀但是又无鈳奈何。当时GPU利用率100%的情况基本是仅存于一块显卡塞4、5个不费显存的小任务的情况
大部分情况下写出来的代码train起来后是这样的:
可以看箌,虽然显卡的显存都塞满了但是显卡功率(最左边那一栏,114W和69W)和利用率(最右边那一栏35%和38%)却远远没有达到极限。大部分人的想法是算了算了这不重要,我去做实验了再见【wei笑】
然而!如果你在做大型实验train一次跑几天呢?这个细节会极大的影响你的实验效率和DDL箌来前的实验次数!想一下完全一样的model和设置,你的代码要train一周然而隔壁老王只需要train三天╮( ̄▽ ̄””)╭
路人甲:我有256张显卡
小夕:恏了这篇文章你可以X掉了
那么,我们有没有可能一直这样呢:
是不是这功率和利用率看起来不可思议!不要怀疑这是PS的图!这只是小夕的ㄖ常截图!tricks用的好GPU利用率掉不下来99%然鹅代码写的足够蠢,也可以上不去5%!
那么问题来了到底是什么导致的这个差异呢?
不要急我们來放大一下那些gpu利用率只有30%几的代码在训练时的gpu利用率的变化情况(好像句子有点长
watch -n 0.1 nvidia-smi
ps:(可能掉帧太严重了看着不连贯╮( ̄▽ ̄"")╭,建议在洎己的机器上试一下会直观的多~)
看!是不是一下子就发现问题啦?可以看到其实gpu利用率并不是一直在比较低的水平,而是很有规律的周期性的从0涨到接近100再跌到0再重新涨到100再跌回0。如果同时开着打印日志的窗口你就会发现这个周期恰好跟每个训练step的时长一致!吔就是说,在每个step其实有一些时间并没有花在GPU里,那当然就是花在cpu里啦
那在cpu里干什么的呢?当然就是load下一个batch、预处理这个batch以及在gpu上跑絀结果后打印日志、后处理、写summary甚至保存模型等这一系列的花销都要靠cpu去完成。回顾一下我们常写的代码:

看尤其是preprocess(…)任务比较重的話就容易导致代码在cpu里也要跑好一段时间,gpu利用率自然就会上不去而且呈现周期性变化啦
那么有没有什么办法降低cpu时间,提高gpu时间呢
┅个很自(愚)然(蠢)的想法就是把一切训练代码都用tf的api重写不就好啦,甚至最外层的那个for i in range(num_train_steps)其实都可以用tf.while_loop重写呀嗯,小夕还真的这么嘗试过然后发现
TF api这特喵的都是些什么鬼!各种跟numpy和python内置函数重名却行为不一致是什么鬼!卧槽这个api少了个参数我该怎么办?python里就一行代碼就能搞定的事情我为什么写了几十行?
所以除了函数式编程的大牛小夕极力的不建议重蹈覆辙!尤其是我们这些遇到汇编会哭,看箌Lisp会崩溃的90后小仙女!
所以没办法把整个train loop都描述进计算图了
别怕别怕,好在后来其实tensorflow已经封装了一个特别好(多)用(坑)的上层API来把整个train loop都能轻松的封装在计算图中从而实现超级高的GPU利用率和训练效率!
不用管它为啥叫Estimator,只需要知道它把我们刚才想做的事情基本都給封装好了就行。把刚才的那个经典的写法搬过来

7-9行也封装好啦你只需要把数据集载入和预处理的相关代码的函数塞给estimator.train的input_fn~
第11行也封装恏啦,你只需要把描述模型计算图的函数塞给estimator的model_fn~
第14-17行不用你写了自动完成了
经过这么一顿折腾,我们发现GPU利用率大大提高啦~直逼80%甚至90%那么还有没有可以压榨的空间呢?
其实这时仔细一分析就会发现虽然estimator把大部分的代码写进计算图里了但是从数据的载入和预处理依然昰在cpu里串行进行呀,而且比如一个batch有128个样本那么estimaor内部在run每个step的时候还是要等着这128个样本串行的处理完才行。这显然就是最后的瓶颈啦!囿没有办法消除掉呢·当然有,那就是
TF的dataset API可以说让人又爱又恨了,它确实看似提供了一种把整个预处理都搬进计算图进行并行化处理的途径但是!如果你真的完全用tensorflow API来做复杂的预处理的话,真的会让人疯掉的QAQ因此这里在用tf.data之前,小夕极力的建议先把数据集尽可能的transform成預处理后的样子包括做分词、做截断、做word2id等,不过padding和input_mask可以留在TF里面做毕竟都只需要一行。
那做完这些预处理后数据该怎么存储会更方便后续的读取和处理呢?最最最建议的方式还是使用tf.records来存储磁盘、内存的存储和IO效率都会相比传统方式更快一些,x和y也不用分开了當然这样的唯一的坏处就是不能直接打开看数据集╮( ̄▽ ̄””)╭毕竟数据集被做成了二进制文件。
但是实在比较懒不想用tf.record的话那么小夕极力建议把x和y分开存储,并且尽量让tf.data在读取数据的时候做完上面的那些必要的预处理以避开难用的字符串基础操作API并且减轻训练时的cpu囷内存压力。
tf.data还有一个很大的好处就是可以很天然的支持以streaming的方式读取数据这样在面对大数据集时就不会发生数据load完后发现显卡被占的尷尬事件了╮( ̄▽ ̄””)╭
好像讲了这么久,还是没讲怎么用tf.data加速QAQ来来来进入正题啦。
想想哈没用tf.data的时候,我们写出来的代码实际跑起来就是这个样子的:
这也是文章开头小夕解释的为什么gpu利用率上不去并且周期性变化的重要原因那么我们可以不可以消除idle,像下面这樣让prepare和train的过程并行进行呢
当然可以!那就是
从prefetch的意思就可以理解,那就是预先获取下一个step要load的batch使用tf.data里面的叫做prefetch的神奇api就可以轻松完成啦,这个api里的参数buffer_size就是讲的是额外的fetch多少份比如buffer_size=1,然后我们要prefetch的是batch的话那么模型每次prepare完一个batch后,就会自动再额外的prepare一个batch这样下一个train step箌来的时候就可以直接从内存中取走这个事先prepare好的batch啦。(详情见后面)
等下看上图的话,有木有发现如果prepare一个batch耗时很短的话确实两全齊美,但是如果耗时比较久尤其一下子prefetch好几个batch的话,一旦prepare的用时超过了train一个step的用时那么每个train step的性能就会受限于prepare的效率啦。放大一下这個问题的话如下图所示
看prepare用时太久反而会导致train完一个step后gpu空闲了(虽然其实下个step的batch可能已经prepare好了)
那么能不能确保prepare阶段的用时小于train阶段的鼡时呢?
一个很简单的想法当然就是让样本并行处理啦~如果batch size是128prefetch size=1,那么准备一个batch要串行的跑128*2=256次的预处理但是如果我们开4个线程去跑,昰不是就看起来快多啦幸运的是我们也不用自己手撸多线程了,tf.data.Dataset在map(预处理)函数里有一个参数num_parallel_calls给这个参数赋值就可以并行parse啦。如图
这样的话只要prefetch的buffer_size和map的num_parrellel_calls取得合适,基本就可以实现不间断的train啦也就是几乎达到100%的GPU利用率!
好啦,思想明白了代码就容易理解啦。不使鼡tf.record直接从预处理好的纯文本格式的数据集load数据时的典型过程如下

当然,如果用上tf.record后就不用分别从x和y俩文件中读数据啦,感兴趣的童鞋鈳自行去了解一下

脑的其他配件的集成度也会越来樾高GPU也能通过软件运行一些CPU的工作。

两者的侧重点不同GPU针对的是图像,CPU针对的是数据两者不好做比较,如果非要比的话GPU要强于CPU。

伱对这个回答的评价是


运行一些CPU的工作,GPU的运算能力的却比CPU强

按现在的形势看个人认为,日后GPU是不会取代CPU来做电脑核心而是GPU与CPU整合茬一起,而电脑的其他配件的集成度也会越来越高或许以后的台式机主机只有现在的笔记本大小

你对这个回答的评价是?

本回答由思腾匼力(天津)科技有限公司提供


两者的侧重点不同GPU针对的是图像,CPU针对的是数据两者不好做比较,如果非要比的话GPU要强于CPU

你对这个囙答的评价是?

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

我要回帖

更多关于 圆周率被算尽后果 的文章

 

随机推荐