2017-03-02 24 views
6

Zastanawiam się, czy istnieją jakieś poważne wady (np. Dotyczące wydajności obliczeniowej, pamięci ...) w tworzeniu elementów zastępczych TensorFlow dla zmiennych wielkości wejściowych (w przeciwieństwie do stałych wielkości wejściowych)?Czy są jakieś minusy tworzenia symboli zastępczych TensorFlow dla zmiennych o rozmiarze zmiennym a o stałych rozmiarach?

Say, robie uczenia mini wsadowy i zainicjować wykres z zastępczego, gdzie zakładamy stałą batch_size antycypowania:

tf.placeholder(..., shape=[batch_size, ...]) 

Alternatywnie, można zainicjować zmienną zastępczy tak, że przyjmuje zmienne wejściowe wielkości :

tf.placeholder(..., shape=[None, ...]) 

nie jestem zaznajomiony z niskim poziomem tensorflow implementacje pod maską, ale nie ten ostatni musiał sprawdzić wymiary, przydzielić pamięci, a także tworzyć nowe tablice w każdej iteracji w celu uwzględnienia przypadku, gdy m y zmiany wielkości minibagusa podczas treningu? Tak więc, w zależności od implementacji, czy nie byłoby to obliczeniowo marnotrawstwem, jeśli pracuję ze stałym wymiarem wsadowym?

Odpowiedz

5

Występuje wyraźne napięcie między dostarczaniem w pełni zdefiniowanych kształtów (które może dać lepszą wydajność) i umożliwienia zmiany wymiarów (co sprawia, że ​​wykres przepływu danych jest łatwiejszy do ponownego użycia). Jak można podejrzewać, istnieją pewne wady do korzystania zmiennym kształcie tf.placeholder() ops reprezentuje wejście w modelu TensorFlow:

  • TensorFlow jest często w stanie uprościć przepływ danych wykres gdy kształty są w pełni znane. Na przykład wywołanie tf.shape(x) zwraca tf.Tensor zawierający prawdziwy kształt dynamiczny tensora x. Jeśli ten kształt zostanie w pełni zdefiniowany w czasie budowy wykresu, TensorFlow zastąpi obliczenia kształtu wartością tf.constant(), i będzie to wykorzystywane w przypadku stałych optymalizacji składanych, aby zmniejszyć ilość pracy wykonywanej w czasie wykonywania.

  • W skrajnym przypadku, XLA compiler wymaga, aby wszystkie kształty tensor wejściowe być w pełni zdefiniowane przed wygenerowany kod, tak, że może generować dużo bardziej wydajny kod jądra, gdzie granice array (etc.) są stałe w czasie kompilacji. XLA ponownie kompiluje kod jądra dla każdej kombinacji kształtów wejściowych, więc użycie tensorów o stałym rozmiarze pozwoli uniknąć nadmiaru rekompilacji.

  • pamięć podzielnik TensorFlow jest obecnie robi przeznaczyć nowe tablice dla każdego pośrednim i wyjściowym tensora przy każdym wywołaniu tf.Session.run(). Jednak podstawowe alokatory pamięci (alokator BFC dla pamięci GPU i tcmalloc lub jemalloc dla pamięci procesora) mają tendencję do lepszej wydajności, jeśli mają statyczny rozkład żądań alokacji (ponieważ żądania mogą być spełnione z buforów, które zostały ostatnio zwolnione).

+0

dzięki za to miłe i wyczerpujące wyjaśnienie! Tak więc, w przypadku dużych (długich do pociągu) modeli prawdopodobnie byłoby bardziej wydajne niż ustalenie wielkości partii. Jednak w przypadku walidacji i oceny (testy walidacyjne i zestawy testowe) konieczne byłoby posiadanie równoległego wykresu, który byłby zasilany zmiennymi z wykresu treningowego, które mogłyby przeważyć korzyści. – Sebastian

+1

To chyba prawda. Trudność jest ostateczna w odniesieniu do względnej wydajności, ale zauważyliśmy poprawę w zakresie czasu działania o 5% dzięki wykorzystaniu statycznych informacji o kształcie, więc jeśli masz długotrwały program, prawdopodobnie warto użyć osobnych programów do treningu/eval z możliwie największą ilością informacji statycznych. – mrry