我正在使用Tensorflow 1.2。用于AWS p2实例(Tesla K80)上的图像分割。有没有一种简单的方法让我知道我是否可以提高代码的性能?
以下是我所知道的:
sess.run([train_op,loss,labels_modified,output_modified], feed_dict = feed_dict)
其中feed_dict是从占位符到张量的映射。
session.run方法仅需要0.43秒来执行以下参数:batch_size = 1,image_height = 512,image_width = 512,channels = 3。
网络有14个卷积层(没有密集层),共有1,100万个可训练参数。
因为我正在进行分段,所以我使用批量大小为1,然后计算像素损失(512 * 512交叉熵损失)。
我尝试从源代码编译Tensorflow并且性能改进为零。
我仔细阅读了效果指南https://www.tensorflow.org/performance/performance_guide,但我不想花很多时间来尝试所有这些建议。我花了8个小时来编译Tensorflow,它给了我零利益!
如何找出会话的哪些部分大部分时间都在运行?我觉得这可能是损失计算。
是否有任何明确的研究表明我可以从性能指南中提到的内容中获得多少加速?
答案 0 :(得分:0)
您正在执行计算密集型任务,需要大量计算和大量内存。您的模型有很多参数,每个参数都需要向前,向后和更新计算。
您链接的页面中的建议是正常的,如果您按照它们进行操作,除了创建另一个(1个或多个)实例并并行运行火车外,您无法做任何其他操作。这将为您提供Nx加速(其中N是计算输入批次的渐变的实例数)但它非常昂贵且并不总是适用(此外,它需要更改您的代码以使其跟随客户端 - 用于梯度计算和权重更新的服务器体系结构)
答案 1 :(得分:0)
也许您可以使用tfprof运行代码来进行一些分析,以找出瓶颈所在。
对于猜测,性能问题可能是由数据输入引起的。不知道你是如何准备feed_dict的,如果你必须从磁盘读取数据以便为每个sess.run准备feed_dict,它将减慢读取数据的程序并且训练是同步的。您可以尝试使用tf.FIFOQueue将数据转换为tfrecords,使异步加载数据和训练
答案 2 :(得分:0)
根据您的一小段代码,我发现您正在使用Feed字典。通常,如果可以使用队列,最好避免使用Feed字典(请参阅https://github.com/tensorflow/tensorflow/issues/2919)。 Tensorflow文档涵盖了队列here的使用。切换到队列肯定会提高你的表现。