Cloud ML上的Tensorflow出队速度非常慢

时间:2017-05-11 22:24:00

标签: performance tensorflow queue pipeline google-cloud-ml

我正在尝试在云上运行CNN(Google Cloud ML),因为我的笔记本电脑没有GPU卡。

所以我将数据上传到Google云端存储。包含1500个条目的.csv文件,如下所示:

    | label  |  img_path  |
    | label_1| /img_1.jpg |
    | label_2| /img_2.jpg |

和相应的1500 jpgs。

我的input_fn如下:

def input_fn(filename,
         batch_size,
         num_epochs=None,
         skip_header_lines=1,
         shuffle=False):
filename_queue = tf.train.string_input_producer(filename, num_epochs=num_epochs)
reader = tf.TextLineReader(skip_header_lines=skip_header_lines)
_, row = reader.read(filename_queue)
row = parse_csv(row)
pt = row.pop(-1)
pth = filename.rpartition('/')[0] + pt
img = tf.image.decode_jpeg(tf.read_file(tf.squeeze(pth)), 1)
img = tf.to_float(img) / 255.
img = tf.reshape(img, [IMG_SIZE, IMG_SIZE, 1])
row = tf.concat(row, 0)
if shuffle:
    return tf.train.shuffle_batch(
        [img, row],
        batch_size,
        capacity=2000,
        min_after_dequeue=2 * batch_size + 1,
        num_threads=multiprocessing.cpu_count(),
    )
else:
    return tf.train.batch([img, row],
                          batch_size,
                          allow_smaller_final_batch=True,
                          num_threads=multiprocessing.cpu_count())

以下是完整图表的样子(确实非常简单的CNN): Full graph

运行批量大小为200的培训,然后我的笔记本电脑上的大部分计算时间(在我的笔记本电脑上,数据存储在本地)都花在渐变节点上,这正是我所期望的。批处理节点的计算时间约为12毫秒。

当我在云上运行它(比例级是BASIC)时,批处理节点需要20多秒。根据tensorboard,瓶颈似乎来自QueueDequeueUpToV2子节点:

Inside the batch node, QueueDequeueUpToV2

任何人都知道为什么会这样?我很确定我在这里弄错了,所以我很乐意学习。

几句话: - 使用不同的min_after_dequeue修改batch / shuffle_batch之间不会产生影响。 - 当使用BASIC_GPU时,批处理节点也在CPU上,根据我读到的内容是正常的,大约需要13秒。 - 在队列启动后添加time.sleep以确保没有饥饿也没有效果。 - 计算时间在batch_size中确实是线性的,因此当batch_size为50时,计算时间将比batch_size为200小4倍。

感谢阅读,如果有人需要,我很乐意提供更多详细信息。

最佳, 人

更新

-Cloud ML实例和Buckets不在同一个区域,使得它们在同一区域内的结果提高了4倍。

创建.tfrecords文件使批处理需要70毫秒,这似乎是可以接受的。我以blog帖子作为起点来了解它,我推荐它。

我希望这会帮助其他人创建一个快速的数据输入管道!

2 个答案:

答案 0 :(得分:3)

尝试将图像转换为tfrecord格式并直接从图形中读取。你的方式,没有缓存的可能性,如果你的图像很小,你没有利用云存储的高持续读取。将所有jpg图像保存到tfrecord文件或少量文件将有所帮助。

此外,请确保您的存储区是具有gpus的区域中的单个区域存储区,并且您要在该区域中提交到cloudml。

答案 1 :(得分:0)

之前我遇到过类似的问题。我通过将tf.train.batch()更改为tf.train.batch_join()来解决它。在我的实验中,64个批量大小和4个GPU,使用tf.train.batch()花费了22分钟,而使用tf.train.batch_join()花了2分钟。

在Tensorflow doc中:

如果您需要在文件之间进行更多并行或重复示例,请使用tf.train.shuffle_batch_join

使用多个阅读器实例

https://www.tensorflow.org/programmers_guide/reading_data