Operacje max
i exp
są zasadniczo różne; exp
(i inne operacje, takie jak dodawanie, sin
, itp.) Jest operacją elementarną, która jest zawstydzająco równoległa, podczas gdy max
wymaga algorytmu skanowania równoległego, który zasadniczo buduje drzewo porównań parami w tablicy. Przyspieszenie max
nie jest niemożliwe, ale nie jest tak łatwe jak exp
.
Zresztą realizacja theano
z max
w zasadzie składa się z następujących linii (w Theano/tensora/basic.py):
try:
out = max_and_argmax(x, axis)[0]
except Exception:
out = CAReduce(scal.maximum, axis)(x)
gdzie max_and_argmax
jest kilka kodu niestandardowego, że do mojego oka, narzędzia operacja max + argmax przy użyciu numpy
i CAReduce
to standardowa akcelerowana przez GPU operacja skanowania używana jako rezerwowa (która, zgodnie z komentarzami, nie obsługuje grad
itp.). Możesz spróbować użyć kreacji zastępczej bezpośrednio i sprawdzić, czy jest to szybsze, może coś takiego:
from theano.tensor.elemwise import CAReduce
from theano.scalar import maximum
def mymax(X, axis=None):
CAReduce(maximum, axis)(X)
Tak, miałem na czasie całą kopię + obliczenia. Będę próbował profilera Theano. Chcę przyspieszyć operację max (X, axis = 0), w tym koszty ogólne kopiowania. Wydaje mi się, że nie mogę tego uzyskać dla dowolnych rozmiarów matrycy. Co sugerujesz? – hrs
Jak próbowałem powiedzieć w odpowiedzi, nie sądzę, że będziesz w stanie uzyskać przyspieszenie do maksymalnej redukcji jeśli uwzględnisz czas transferu z dowolnym systemem, nie tylko Theano. Aby zredukować procesor, wąskim gardłem jest odczyt z pamięci.Przeniesienie na GPU odbywa się wolniej, niż odczyt z pamięci CPU przez rdzenie procesora. Jeśli chcesz przyspieszyć procesor graficzny, który obejmuje transfer, potrzebujesz więcej obliczeń do wykonania na GPU. – nouiz