Я пытаюсь использовать несколько очередей для чтения и пакетной обработки, но это вызывает временную блокировку TF. Вот некоторые примеры кода:Несколько очередей, вызывающих блокировку TF
import tensorflow as tf
coordinator = tf.train.Coordinator()
file_queue = tf.train.string_input_producer(tf.train.match_filenames_once(...))
reader = tf.TextLineReader()
key, serialized_example = reader.read(file_queue)
keys, serialized_examples = tf.train.batch([key, serialized_example], 10)
# repeat the code snippet below multiple times, in my case 4
file_queue_i = tf.train.string_input_producer(tf.train.match_filenames_once(...))
reader_i = tf.TextLineReader()
key_i, serialized_example_i = reader.read(file_queue_i)
initializer = tf.initialize_all_variables()
session = tf.Session(config=tf.ConfigProto(inter_op_parallelism_threads=1, intra_op_parallelism_threads=1))
session.run(initializer)
threads = tf.train.start_queue_runners(sess=session, coord=coordinator)
session.run(keys)
TensorFlow иногда зависает на последней строке, когда я на самом деле пытаются запустить что-то. Однако это поведение довольно сложно воспроизвести, используя приведенный выше код. В 1000+ работает, я мог только заставить его повесить один раз. В моем реальном коде реальный читатель более сложный, и он использует TFRecords, но в остальном все одно и то же. Там он вешает 2/3 времени с 3 очередями в общей сложности. С 5 очередями он, похоже, никогда не запускается, и с 1 очередью он, кажется, никогда не висит. Это на Mac с 0,6. У меня другая система Ubuntu, также с 0,6, и я получаю ту же проблему (хотя частота блокировки намного выше в системе Ubuntu).
ОБНОВЛЕНИЕ. Более точную оценку того, как часто код блокируется, составляет 1 из 5000 испытаний.
Нити будет висеть, если он читает из пустой очереди, или нажав на полные очереди. Я не понимаю ваш фрагмент, хотя вы читаете только 2 очереди, а reader_i нигде не используется –
Правильно, проблема возникает, когда я создаю другие очереди, даже если я их активно не использую. Я использую один, но остальные только что созданы и не оцениваются (хотя, естественно, они будут заполнены бегуном очереди). Разумеется, дело не в коде, а в том, что нет необходимости оценивать других читателей, чтобы они действительно наблюдали эту проблему. Что касается подвешивания при чтении из пустой очереди - не нужно ли это на мгновение висеть, пока очередь не заполнится? Видения, которые я вижу, постоянны. Я должен закончить. –
oh, interesting .... число нитей имеет значение на частоте блокировки? –