当我们在本地运行Tensorflow(在没有GPU的PC上)时,Tensorflow训练成功(但速度很慢)。但是,当我们将其发送到GoogleML(单个GPU)时,它无法进行训练。代码或输入的数据没有变化。
从TF记录读取数据时发生错误。一些相关代码:
files = tf.data.Dataset.list_files(XXXX)
dataset = files.apply(tf.contrib.data.parallel_interleave(tf.data.TFRecordDataset, cycle_length=XXXX, sloppy=True, buffer_output_elements=XXXX))
dataset = dataset.apply(tf.contrib.data.map_and_batch(map_func=_parse_transform_function, batch_size=config.batch_size, num_parallel_calls=config.num_parallel_calls))
dataset = dataset.repeat()
dataset = dataset.prefetch(config.prefetch)
files = tf.data.Dataset.list_files(XXXX)
dataset = files.apply(tf.contrib.data.parallel_interleave(tf.data.TFRecordDataset, cycle_length=XXXX, sloppy=True, buffer_output_elements=XXXX))
dataset = dataset.apply(tf.contrib.data.map_and_batch(map_func=_parse_transform_function, batch_size=config.batch_size, num_parallel_calls=config.num_parallel_calls))
dataset = dataset.repeat()
dataset = dataset.prefetch(config.prefetch)
training_iterator = dataset.make_one_shot_iterator()
handle = tf.placeholder(tf.string, shape=[])
iterator = tf.data.Iterator.from_string_handle(handle, dataset.output_types, dataset.output_shapes)
next_element = iterator.get_next()
...
with tf.Session() as sess:
training_handle = sess.run(training_iterator.string_handle())
for i in range(config.epochs):
_image, _landmarks, _height, _width, _size, _kp_true, _short_offsets_true, _long_offsets_true = sess.run(next_element, feed_dict={handle: training_handle})
这是我们得到的错误:
错误2018-11-28 15:32:55 -0800服务OutOfRangeError(请参见上文) 追溯):序列结束错误2018-11-28 15:32:55 -0800服务[[节点:IteratorGetNext = IteratorGetNextoutput_shapes = [[?, 416,416,3],[?, 34,5],[?],[?],[?], [?,52,52,11],[?,52,52,22],[?,52,52,40]],output_types = [DT_FLOAT, DT_FLOAT,DT_FLOAT,DT_FLOAT,DT_INT32,DT_FLOAT,DT_FLOAT,DT_FLOAT], _device =“ / job:localhost /副本:0 /任务:0 /设备:CPU:0”]]
同样,我们没有更改数据或代码,因此我们认为Tensorflow代码中没有错误。为什么同一实现无法在GoogleML中训练?
答案 0 :(得分:0)
“ OutOfRangeError(请参阅上面的回溯):序列结束”具有误导性。似乎表明我们已经达到了tfrecords的末尾,但事实并非如此。
问题是“ _parse_transform_function”(未显示)中的操作正在使用GPU不支持的操作。
解决方案:在代码的数据集部分周围使用“ with tf.device('/ cpu:0'):”,以使用CPU进行预处理。仍在训练中使用的GPU。