精华内容
下载资源
问答
  • 首先,如果你现在已经很熟悉tf....尤其是苦恼于GPU显存都塞满了利用率却上不去的童鞋,这篇文章或许可以给你打开新世界的大门噢( ̄∇ ̄) 如果发现经过一系列改良后训练效率大大提高了,记得回来给小夕发小红包( ̄...
        

    前言

    红尘小说 https://wap.zuxs.net/

    首先,如果你现在已经很熟悉tf.data+estimator了,可以把文章x掉了╮( ̄▽ ̄””)╭

    但是!如果现在还是在进行session.run(..)的话!尤其是苦恼于GPU显存都塞满了利用率却上不去的童鞋,这篇文章或许可以给你打开新世界的大门噢( ̄∇ ̄)

    如果发现经过一系列改良后训练效率大大提高了,记得回来给小夕发小红包( ̄∇ ̄)

    不过,这并不是一篇怒贴一堆代码,言(三)简(言)意(两)赅(语)就结束的CSDN文风的文章。。。所以伸手党们也可以X掉了╮( ̄▽ ̄””)╭

    缘起

    很早很早之前,在小夕刚接触tensorflow和使用GPU加速计算的时候,就产生过一个疑惑。为什么显卡的显存都快满了,GPU利用率还显示这么低呢?好浪费呀,但是又无可奈何。当时GPU利用率100%的情况基本是仅存于一块显卡塞4、5个不费显存的小任务的情况。

    在比较极端的情况下,甚至GPU的利用率会降到10%以下,就像这样:

    而大部分情况下写出来的代码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去完成。回顾一下我们常写的代码:

    create_graph()
    create_model_saver()
    create_summary_writer()
    create_session()
    do_init()
    for i in range(num_train_steps):
        load_batch(...)                # cpu
        preprocess(...)                # cpu
        feed_dict = {...}              # cpu
        fetch_list = [...]             # cpu
        buf = session.run(fetch_list, feed_dict)    # gpu
        postprocess(buf)               # cpu
        print(...)                     # cpu
        if i % x == 0:
            summary_writer.write(...)  # cpu
        if i % xx == 0:
            model_saver.save(...)      # 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

    不用管它为啥叫Estimator,只需要知道,它把我们刚才想做的事情基本都给封装好了就行。把刚才的那个经典的写法搬过来

    1. create_model()
    2. create_model_saver()
    3. create_summary_writer()
    4. create_session()
    5. do_init()
    6. for i in range(num_train_steps):
    7.      load_batch(...)                # cpu
    8.      preprocess(...)                # cpu
    9.      feed_dict = {...}              # cpu
    10.     fetch_list = [...]             # cpu
    11.     buf = session.run(fetch_list, feed_dict)    # gpu
    12.     postprocess(buf)               # cpu
    13.     print(...)                     # cpu
    14.     if i % x == 0:
    15.         summary_writer.write(...)  # cpu
    16.     if i % xx == 0:
    17.         model_saver.save(...)      # cpu

     

    1-5行在estimator中都封装好啦,你只需要把相关配置塞进estimator的RunConfig就可以啦~

    7-9行也封装好啦,你只需要把数据集载入和预处理的相关代码的函数塞给estimator.train的input_fn~

    第10行也封装好啦,你只需要把要fetch的loss、train_op丢进estimator的EstimatorSpec~

    第11行也封装好啦,你只需要把描述模型计算图的函数塞给estimator的model_fn~

    第12-13行不用操心细节了,global_step和loss自动完成了,剩下的丢给tf.Print和LoggingTensorHook吧~

    第14-17行不用你写了,自动完成了

    ╮(╯▽╰)╭

    经过这么一顿折腾,我们发现GPU利用率大大提高啦~直逼80%甚至90%。那么还有没有可以压榨的空间呢?

    其实这时仔细一分析就会发现虽然estimator把大部分的代码写进计算图里了,但是从数据的载入和预处理依然是在cpu里串行进行呀,而且比如一个batch有128个样本,那么estimaor内部在run每个step的时候还是要等着这128个样本串行的处理完才行。这显然就是最后的瓶颈啦!有没有办法消除掉呢?·当然有,那就是

    tf.data

    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

    从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阶段的用时呢?

    parallel mapping

    一个很简单的想法当然就是让样本并行处理啦~如果batch size是128,prefetch 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数据时的典型过程如下

    def build_input(..):
        x = tf.data.XXDataset(..)
        x = x.map(..., num_parallel_calls=N)        # parellel
    
        y = tf.data.XXDataset(..)
        y = y.map(..., num_parallel_calls=N)
    
        dataset = tf.data.Dataset.zip((x, y))
        dataset = dataset.repeat(num_epochs)    
        if is_train:
            dataset = dataset.shuffle(..)
        dataset = dataset.batch(batch_size)
        dataset = dataset.prefetch(buffer_size=1)   # prefetch
        iterator = dataset.make_xx_iterator()
        return iterator.get_next()

     

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

    补充福利

    当然,刚从传统的代码迁移到tf.data+estimator的时候可能会不太适应,最主要的还是debug的方式,不能像之前一样直接session.run(debug_tensor)了,那怎么办呢?

    一般来说我们打印tensor有两种情况,一种是计算图出错时需要打印一次或几次来定位问题,一种是像global_step,loss等需要周期性check。对于这两种情况,之前是习惯session.run的时候把要打印的tensor也run出来,而现在这两种情况可以区分对待啦。

    对于第一种,小夕感觉最高效的还是直接在计算图里插tf.Print(..),使用非常方便,debug能力很强大!如果打印还需要配合global step,加一条tf.cond就搞定啦。对于第二种,其实global step和loss的话estimator默认就会打印出来,如果是其他需要周期性打印的tensor,那么就用tf.train.LoggingTensorHook包装一下然后丢进estimator.train里吧~习惯之后竟然还感觉挺方便的m(_ _)m

    最后,愿天下没有空闲的显卡

    关注【OpenCV与AI深度学习】

    长按或者扫描下面二维码即可关注

    展开全文
  • 企业IT部门一直在寻求提高香港服务器效率的方法,最大限度地提高利用率以实现利益最大化。管理者在维护服务器安全性的同时提高效率的方式包括虚拟化、监控工具和更新服务器。 一、虚拟化 如果您不想投资额外的服务器...

    本文编辑:富哥

    伴随经济全球化趋势的深入,越来越多企业使用香港服务器租用服务来搭建外贸网站,拓展海外市场。企业IT部门一直在寻求提高香港服务器效率的方法,最大限度地提高利用率以实现利益最大化。管理者在维护服务器安全性的同时提高效率的方式包括虚拟化、监控工具和更新服务器。

    一、虚拟化
    如果您不想投资额外的服务器租用服务,而是希望充分利用现有服务器,那么虚拟化就是一个合适的解决方案。一个虚拟服务器的作用就像许多台计算机。通过管理工具可帮助您优化每台服务器的性能,并最大限度地延长服务器的正常运行时间。您可以利用虚拟化软件将计算机的硬盘分成几个部分,使每个部分充当单独的硬盘。虚拟化允许您在同一台计算机上使用多个操作系统。它还可以降低开支并节省空间。

    二、管理工具
    如果您拥有一定规模的服务器、交换机和IP资源,您可以采用DCIM(数据中心基础设施管理)软件来提升服务器管理效率。例如,简单的DCIM管理工具可以通过自动化脚本和工具来实现高效的服务器管理,例如自动分配IP地址、自动安装系统、端口监控等。此外,管理工具可轻松查看您的服务器在整个数据中心的物理位置和运行状况,从而决定跨各种服务器规划工作负载分配。

    三、投资最新的服务器技术
    更新服务器是提高服务器效率的另一种好方法。投资最新的服务器技术,为您提供更高的能源效率和更好的I/ O和CPU性能提升。建议每3年更新一次服务器,以确保您的企业具有高效的服务器。通过更新香港服务器租用服务,您可以为您的IT部门提供面向未来的机会,以保障您的企业未来的发展方向。您应该投资满足企业需求的服务器,包括针对客户应用程序进行优化的服务器。

    本文仅代表个人观点,感谢阅读。
    专业的服务,来自专业的态度。

    展开全文
  • 机器学习如何提高GPU利用率

    千次阅读 2019-11-21 02:10:25
    尤其是苦恼于GPU显存都塞满了利用率却上不去的童鞋,这篇文章或许可以给你打开新世界的大门噢( ̄∇ ̄) 如果发现经过一系列改良后训练效率大大提高了,记得回来给小夕发小红包( ̄∇ ̄) 不过,这并不是一篇怒贴一堆...

    前言

    首先,如果你现在已经很熟悉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去完成。回顾一下我们常写的代码:

    create_graph()
    create_model_saver()
    create_summary_writer()
    create_session()
    do_init()
    for i in range(num_train_steps):
        load_batch(...)                # cpu
        preprocess(...)                # cpu
        feed_dict = {...}              # cpu
        fetch_list = [...]             # cpu
        buf = session.run(fetch_list, feed_dict)    # gpu
        postprocess(buf)               # cpu
        print(...)                     # cpu
        if i % x == 0:
            summary_writer.write(...)  # cpu
        if i % xx == 0:
            model_saver.save(...)      # 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

    不用管它为啥叫Estimator,只需要知道,它把我们刚才想做的事情基本都给封装好了就行。把刚才的那个经典的写法搬过来

    1. create_model()
    2. create_model_saver()
    3. create_summary_writer()
    4. create_session()
    5. do_init()
    6. for i in range(num_train_steps):
    7.      load_batch(...)                # cpu
    8.      preprocess(...)                # cpu
    9.      feed_dict = {...}              # cpu
    10.     fetch_list = [...]             # cpu
    11.     buf = session.run(fetch_list, feed_dict)    # gpu
    12.     postprocess(buf)               # cpu
    13.     print(...)                     # cpu
    14.     if i % x == 0:
    15.         summary_writer.write(...)  # cpu
    16.     if i % xx == 0:
    17.         model_saver.save(...)      # cpu
    

    1-5行在estimator中都封装好啦,你只需要把相关配置塞进estimator的RunConfig就可以啦~

    7-9行也封装好啦,你只需要把数据集载入和预处理的相关代码的函数塞给estimator.train的input_fn~

    第10行也封装好啦,你只需要把要fetch的loss、train_op丢进estimator的EstimatorSpec~

    第11行也封装好啦,你只需要把描述模型计算图的函数塞给estimator的model_fn~

    第12-13行不用操心细节了,global_step和loss自动完成了,剩下的丢给tf.Print和LoggingTensorHook吧~

    第14-17行不用你写了,自动完成了

    ╮(╯▽╰)╭

    经过这么一顿折腾,我们发现GPU利用率大大提高啦~直逼80%甚至90%。那么还有没有可以压榨的空间呢?

    其实这时仔细一分析就会发现虽然estimator把大部分的代码写进计算图里了,但是从数据的载入和预处理依然是在cpu里串行进行呀,而且比如一个batch有128个样本,那么estimaor内部在run每个step的时候还是要等着这128个样本串行的处理完才行。这显然就是最后的瓶颈啦!有没有办法消除掉呢?·当然有,那就是

    tf.data

    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

    从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阶段的用时呢?

    parallel mapping

    一个很简单的想法当然就是让样本并行处理啦~如果batch size是128,prefetch 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数据时的典型过程如下

    def build_input(..):
        x = tf.data.XXDataset(..)
        x = x.map(..., num_parallel_calls=N)        # parellel
    
        y = tf.data.XXDataset(..)
        y = y.map(..., num_parallel_calls=N)
    
        dataset = tf.data.Dataset.zip((x, y))
        dataset = dataset.repeat(num_epochs)    
        if is_train:
            dataset = dataset.shuffle(..)
        dataset = dataset.batch(batch_size)
        dataset = dataset.prefetch(buffer_size=1)   # prefetch
        iterator = dataset.make_xx_iterator()
        return iterator.get_next()
    

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

    展开全文
  • Java利用多线程执行SQL减少执行时间提高效率 首先这是个人在实际的项目中使用的代码,部分敏感代码没有上,不过不影响对代码的理解: 1.实现自己的线程 /** * * @author * @date */ package ...

    首先这是个人在实际的项目中使用的代码,部分敏感代码没有上,不过不影响对代码的理解:

    1.实现自己的线程

    /**
     * @author 
     * TODO:收款率线程
     */
    public class Thread2CollectionRate implements Runnable{

      private String sql;

      private List<Map<String, Object>> listMap ;

      @Override
      public void run() {
      //此处线程中获取DAO实例是通过spring注入,各位可以根据自己的方式注入
      BaseService service = (BaseService)SpringContextUtil.getService("service");
      List<Map<String, Object>> list = service.getList(sql);

      System.out.println("run tread ok ..................................."  + list.size());
      //添加数据到MAP中去
      if(listMap != null) {
      listMap.addAll(list);
    }

    }

    public String getSql() {
     return sql;
    }

    public void setSql(String sql) {
     this.sql = sql;
    }

    /**
    * @return the listMap
    */
    public List<Map<String, Object>> getListMap() {
    return listMap;
    }




    /**
    * @param listMap the listMap to set
    */
    public void setListMap(List<Map<String, Object>> listMap) {
    this.listMap = listMap;
    }



    }


    2.循环调用线程

    String sql = "你的SQL语句";



    //定义线程池
    ExecutorService e = Executors.newCachedThreadPool();


    List<Map<String, Object>> listMap = new LinkedList<Map<String, Object>>();

    for(int i = 0 ; i < 6; i++) {
      String tempSql = "需要分线程执行的SQL语句";
      Thread2CollectionRate tempTread = new Thread2CollectionRate();
      //把需要装数据的Map放到线程中去
      tempTread.setListMap(listMap);
      //把需要执行的SQL放到线程中去
      tempTread.setSql(tempSQL);
      //执行线程
      e.execute(tempTread);

    }

    //通知关闭线程池
    e.shutdown();
    //死循环等待线程池完全关闭,只有所有的线程全部执行完毕e.isTerminated()等于true


    try {
    while(true) {
      if(e.isTerminated()) {
      //listMap中就是你所需要的全部数据
      System.out.println("listMap.size() :" + listMap.size());
      break;
     }
    //每次循环等待250毫秒
    Thread.sleep(250);
    }
    } catch (InterruptedException e1) {
    e1.printStackTrace();
    }



    }



    展开全文
  • 批处理中如何提高CPU利用率

    千次阅读 2021-04-11 23:56:36
    在批处理中追求吞吐量,所以对CPU的利用率要求很高,这里有2种可以提高CPU利用率的技术。 一是代码生成技术(CodeGen),二是CPU亲和技术。 补充 CodeGen 拿 Spark 举例说明,Spark1.5版本中更新较大的是DataFrame...
  • torch.utils.data.DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True, num_workers=8, pin_memory=True) num_workers=8:设置线程数 pin_me
  • 操作系统采用哪些方法提高内存利用率 从操作系统的需求开始说起 要想搞清楚操作系统采用哪些方法来提高内存利用率,首先,我们应该明白操作系统为什么需要提高内存的利用率。 计算机的系统资源分为处理机、存储器、I...
  • 提高带宽利用率!为什么要Pacing?

    千次阅读 2018-10-17 22:44:11
    毫无疑问,这里最重要的是公平性,而非效率。不管是慢启动,加性增窗,乘性减窗,还是后来的Vegas算法的主动退让,其目标都在于保证多条流经过共享链路时能公平共享带宽。这种机制的目标不是让单条流跑得更快。 ...
  • 怎样提高数据库查询效率

    千次阅读 2019-05-13 09:50:03
    主要通过三种途径提高数据库查询效率:1.SQL的性能优化,2.数据库的性能优化,3.查询优化 1.SQL的性能优化 SQL语句是用户访问关系数据库中数据的唯一方法,通常在一个关系数据库上,服务器的SQL进程会使用该服务器...
  • 在讨论「如何」提高内存利用率之前,先问一句「为什么」要提高内存利用率 很简单,因为不够用。 通常意义上的内存即RAM,其价格必然远远高于磁盘。现如今,内存条单条128G都可以买的到(贫穷不仅限制了我的想象力,...
  • 利用Cache分析工具 提高Cache利用率

    千次阅读 2011-11-12 19:44:32
    一、Cache的相关知识 二、TI DSP上的Cache结构 ... 随着CPU主频的提升,带动系统性能的改善,但系统性能的提高不仅仅取决于CPU,还与系统架构、指令结构、信息在各个部件之间的传送速度及存储部件的存取速
  • 提高网络带宽利用率

    千次阅读 2009-10-14 00:17:00
    author:skatetime:2009-10-14提高网络带宽利用率的技术 1. 链路复用: 多路复用技术 是把多个低信道组合成一个高速信道的技术,它可以有效的提高数据链路的利用率,从而使得一条高速的主干链路同时为多条低速的接入...
  • TCP协议中提高网络利用率的机制主要有:Nagle算法,延迟确认应答,捎带应答。 Nagle算法 TCP中为了提高网络利用率,经常使用一个叫Nagle的算法。 该算法是指发送端即使还有应该发送的数据,但如果这部分数据很...
  • 云计算如何更好的提高资源利用率

    千次阅读 2012-09-08 12:38:08
    云计算如何更好的提高资源利用率 发表于09-05 09:01| 782次阅读| 来源CSDN| 3 条评论| 作者吴之晶 公有云私有云OpenStackAWSVMware 摘要:公有云、私有云有何特点,企业又该如何选择?Intel行业...
  • 在深度学习模型训练过程中,在服务器端或者本地pc端,输入nvidia-smi来观察显卡的GPU内存占用率(Memory-Usage),显卡的GPU利用率(GPU-util),然后采用top来查看CPU的线程数(PID数)和利用率(%CPU)。...
  • 所以,我们必须节省时间,有效地使用时间。 人的一生两个最大的财富是:你的才华和你的时间。才华越来越多,但是时间越来越少,我们的一生可以说是用时间来换取才华。如果一天天过去了,我们的时间少了,而才华...
  • 非常有效的提高每日工作效率的方法——阿尔卑斯山时间规划法。 这玩意是时间管理大师罗塔尔.丁.塞维特《把时间花在刀刃上》一书中提出。 本文适用于:平时觉得自己工作效率低,没节奏,老是不由自主的加班的孩纸。 ...
  • 利用索引提高查询效率

    千次阅读 2012-06-04 22:57:28
    如果查询结果仅为一行或很少几行时(高选择性high selectivity),利用索引进行查询会大大提高效率。相比之下,如果没有索引,查询则只能顺序扫描整个表。在OLTP环境下,事务处理在很大程度上依赖于索引。只有在表很...
  • 番茄工作法图解.png 为何要使用番茄工作法 “对很多人来说,时间就像是敌人。...番茄工作法就是针对灵活有效的利用时间而设计的,帮助你完成任务以及提高工作和学习效率。” ——Franceso Cirillo
  • MySQL 利用视图来提高开发效率

    千次阅读 2017-07-17 21:07:01
    如何利用MySQL 视图加快程序开发
  • 如何提高多线程程序的cpu利用率

    千次阅读 2014-07-18 14:07:03
    然后,事情确实你发现创建多线程根本没有让程序快多少,也没有提高多少cpu利用率,甚至可能让cpu利用率下降。唯一能够确定的是多线程能够避免界面假死。为什么会是这样的了。本文将举一些例子和讲述一些原因。 首先...
  • 如何利用科技提高效率,降低成本

    千次阅读 2019-04-04 17:35:57
    以前,企业用数据库来存储客户信息,这些信息必须谨慎保存,并且需要实时手动更新。今天,有许多自动化CRM工具在被设计时...过去,无论企业规模大小,都必须向客户开具纸质发票,并等待数周或更长时间才能完成交易...
  • 今天刚好有点时间,我介绍下CCSpriteBatchNode,以及利用它优化游戏渲染效率。 在cocos2d-x 2.x 之后,大家都看到了左下角的FPS变成3行,多了两行数据。 最上面一行是指的当前场景的渲染批次。(简单理解为需要渲染...
  • 例如时间类型,正确显示需要按特定格式进行读取并且转换。 表格类型说明: table.ctype 0 empty 1 string 2 number 3 date 4 boolean 5 error 代码如下:   from datetime import ...
  • 提高工作效率的12个小建议

    千次阅读 2018-10-26 11:13:49
    想要提高自己的工作效率,必须得学习时间管理,善于利用自己的工作时间,使时间价值最大化,从而提高工作效率。**工作是无限的,时间却是有限的。**时间是最宝贵的财富。没有时间,计划再好,目标再高,能力再强,也...
  • 时间复杂度是衡量算法执行效率的...当算法无法继续优化的情况下,我们该如何进一步提高执行效率呢?一种非常简单又好用的方法就是并行计算。如何借助并行计算的处理思想对算法进行改造? 并行排序 假设我们要给大...
  • 使用区块链技术可以大大提高人力资源管理效率。     去掉中介职能,省时省力    利用区块链技术,可以省掉中介职能,这些职能包括数据核对、提供收据和采购订单。去除这些中间商为企业提供了两大好处:首先,...
  • 提高程序效率应该充分利用CPU的高速缓存。要想编写出对CPU缓存友好的程序就得先明白CPU高速缓存的运行机制。  i5-2400S:  1、有三级缓存分别为 32k(数据、指令缓存分开,分为32k),256K,6144K(四个CPU之间...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 619,777
精华内容 247,910
关键字:

怎样提高时间利用效率