6

TłoThreading w rurociągu wejściowym tensorflow za

Typowe wejście rurociąg w tensorflow wygląda następująco:

    tf.train.string_input_producer(list_of_filenames) 
         (creates queue of filenames) 
            | 
            \|/ 
      fixed length reader reads records from the files 
            | 
            \|/ 
    Read records are decoded and processed(eg if dealing with images then cropping,flipping etc) 
            | 
            \|/ 
      tf.train.shuffle_batch(tensors,num_threads) 
     (creates a shuffling queue and returns batches of tensors) 

Problem

Q1) nie istnieje argument NUM_THREADS w TF funkcji .train.string_input_producer(). Czy to oznacza, że ​​tylko pojedynczy wątek jest przeznaczony do odczytu nazw plików z kolejki nazw plików?

Q2) Jaki jest zakres argumentu num_threads funkcji tf.train.shuffle_batch() np. Liczba wymienionych tu wątków jest używana do odczytywania, dekodowania i przetwarzania plików lub są one używane do tworzenia partii tensorów?

Q3) Czy istnieje sposób drukowania, który wątek odczytuje nazwy plików lub zapisy z określonego pliku, np. Rodzaj zapisu pracy wykonanej przez każdy wątek?

+1

Należy unikać zadawanie wielu pytań naraz na SO. Zadawanie wielu pytań w jednym, dobrze, pytanie nie działa z użyciem formatu Q/A, którego używa SO i może odwrócić ludzi, którzy mogą odpowiedzieć tylko na jedno z pytań. – etarion

+0

@etarion mogą one wyglądać na wiele pytań, ale są one bardzo skorelowane. Są to wszystkie elementy wejściowe rurociągu tensorflow.Jeśli ktoś zdolny do odpowiedzi na którekolwiek z nich na pewno będzie w stanie odpowiedzieć na wszystko z niewielkim wysiłkiem. Po prostu chciałem być pewien o odpowiedziach. –

+0

"Gdyby ktokolwiek, kto byłby w stanie odpowiedzieć na którekolwiek z nich, z pewnością byłby w stanie odpowiedzieć na wszystko z niewielkim wysiłkiem". Każdy, kto jest uprawniony do złożenia tego oświadczenia, byłby w stanie odpowiedzieć na pytania, więc jeśli możesz złożyć to oświadczenie, dlaczego sam nie odpowiesz na to pytanie? – etarion

Odpowiedz

4

Wszystkie operacje ładowania danych są wykonywane w ramach wykresu tensorflow, co należy zrobić, to uruchomić jeden lub więcej wątków do iteracji nad operacjami odczytu/kolejkowania. Tensorflow zapewnia klasę QueueRunner, która dokładnie to robi. Klasa Coordinator pozwala dość trywialnie zarządzać wątkami.

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

To jest przykład kodu z linku powyżej:

# Create a queue runner that will run 4 threads in parallel to enqueue 
# examples. 
qr = tf.train.QueueRunner(queue, [enqueue_op] * 4) 

# Launch the graph. 
sess = tf.Session() 
# Create a coordinator, launch the queue runner threads. 
coord = tf.train.Coordinator() 
enqueue_threads = qr.create_threads(sess, coord=coord, start=True) 
# Run the training loop, controlling termination with the coordinator. 
for step in xrange(1000000): 
    if coord.should_stop(): 
     break 
    sess.run(train_op) 
# When done, ask the threads to stop. 
coord.request_stop() 
# And wait for them to actually do it. 
coord.join(enqueue_threads) 

Jeśli ładowali/przerób próbek poza wykresu (w swoim własnym kodzie, nie używając operacji TF), a następnie nie używałbyś QueueRunner, zamiast tego używałbyś swojej własnej klasy do kolejkowania danych za pomocą polecenia sess.run(enqueue_op, feed_dict={...}) w pętli.

Q1: Ilość wątków jest obsługiwane z: qr.create_threads(sess, coord=coord, start=True)

Q2: sesje TF są bezpieczne dla wątków, każde wywołanie tf.run(...) widzi spójną migawkę aktualnych zmiennych począwszy od kiedy zacząć. Twoje kolejki QueueRunner mogą uruchamiać dowolną liczbę wątków. Będą ustawiać się w kolejce w sposób bezpieczny dla wątków.

Q3: Nie używałem tf.train.string_input_producer siebie, ale myślę, że trzeba zwrócić tensora później na wykresie że dequeued dane, wystarczy dodać, że tensor do listy wniosków w sess.run([train_op, dequeue_op])

+0

Dziękuję za odpowiedź! Chciałbym wyjaśnić pewne aspekty drugiego pytania. Spełnij powyższe polecenie po pewnym odczytaniu i wstępnym przetwarzaniu danych przez wewnętrzne funkcje tensorflow (powiedzmy czytnik o stałej długości i przycinanie, przerzucanie przed zakolejowaniem). 4 wątki, które biegną równolegle powyżej, czy byłyby odpowiedzialne tylko za zagnieżdżenie danych lub za czytanie + preprocesing + zagnieżdżanie? –

+1

Przekażesz operację do QueueRunner, QueueRunner uruchomi tę operację w pętli, nic więcej (poza obsługą domową). Tak więc powinieneś po prostu poprosić QueueRunner, aby wykonał operację, która obsługuje cały odczyt, preprocesing i kolejkowanie. Twoja kolejka będzie prawdopodobnie zależała od twojego preprocesingu, który będzie prawdopodobnie zależał od twojej lektury - więc powinno być po prostu kwestią skolejkowania i umożliwienia TF wykrycia odpowiednich zależności. –