zoukankan      html  css  js  c++  java
  • tensorflow 运行效率 GPU memory leak 问题解决

    问题描述:

      Tensorflow 训练时运行越来越慢,重启后又变好。

      用的是Tensorflow-GPU 1.2版本,在GPU上跑,大概就是才开始训练的时候每个batch的时间很低,然后随着训练的推进,每个batch的耗时越来越长,但是当我重启后,又一切正常了?

    问题查找:

      一开始查到的原因是batch_size 和 batch_num的问题,通过python yield 数据生成器解决,确保内存每次处理的数据确定是batch_size大小,但是发现运行效率还是不高,所以查阅google的一些资料找到如下解决办法。

    问题解决:

      因为在运行时的session里定义了tf的op导致的。这样每一次迭代都会在graph里增加新的节点,导致memory leak,程序越来越慢,最后强行退出。至于在运行时程序有没有增加节点,可以在session里定义graph.finalize()锁定graph,如果跑的时候报错就证明程序在动态添加节点导致的越来越慢。

          修改前代码如下:

    def one_hot(labels):
        labels_num = [strnum_convert(i) for i in labels ]
        batch_size = tf.size(labels_num)
        labels = tf.expand_dims(labels_num, 1)
        indices = tf.expand_dims(tf.range(0, batch_size, 1), 1)
        concated = tf.concat([indices, labels],1)
        onehot_labels = tf.sparse_to_dense(concated, tf.stack([batch_size, 8]), 1, 0)
        #all_hot_labels = tf.reshape(onehot_labels,(1,612))
        return onehot_labels
    

    修改后代码如下:

    def one_hot(labels):
        one_hot_label = np.array([int(i == int(labels)) for i in range(8)])   
    ... ...
    return one_hot_label

         大家可以看到罪魁祸首就是就是这个tf版本的one_hot操作,修改成numpy版本完美解决运行效率问题。

    思考:

            方法二:

      上面问题的原因是GPU memory leak,我们也可以用的是一种曲线救国的方法;每隔1000个batch,当速度明显变慢的时候,就reset graph,然后才重新build模型,再load之前储存的参数tf.reset_default_graph()self.build_model();

      方法三:

            我们在用tensorflow进行数据集制作的时候,发现当我运行eval()函数的时候,程序会越跑越跑慢,eval()生成的数值没有删除,然后会越占越多内存,解决办法是使用del命令就行,一般写成。

    data=Var.eval()  
    #save data to file
    del data
  • 相关阅读:
    Stream流的使用
    ThreadLocal原理和使用场景?
    Python+Appium实现APP自动化测试
    查看Linux系统版本信息
    linux命令之修改yum源为国内镜像
    lsb_release: command not found 解决
    docker安装mysql
    win10 系统出现“你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问。”
    python常用sys模块
    python常用os模块
  • 原文地址:https://www.cnblogs.com/Libo-Master/p/8043164.html
Copyright © 2011-2022 走看看