Ich möchte die Leistung von Theano und CNTK auf eine sehr einfache Aufgabe vergleichen: Matrix-Vektor-Produkt auf der GPU. Ich verwende Theano 0.9.0 und CNTK 2.0.Benchmarking von Theano und CNTK mit einem einfachen Matrix-Vektor-Produkt auf der GPU
Ich möchte die Zeit, die für die Berechnung auf dem Gerät verbraucht wird, nur die Zeit für die Datenübertragung von Host zu Gerät oder umgekehrt messen.
Das Ergebnis, das ich bekam, war so etwas wie dieses: figure (timings theano vs cntk) (N ist die Anzahl der Wiederholungen D, die Größe der Matrix, auf 10000. gesetzt wurde.)
Frage 1:
Es scheint die Zeit, die für einige Vorbereitung verwendet wird (compiling the computational graph?) ist in der ersten Ausführung des Mat-Vec-Produkts in dem CNTK-Fall enthalten. Gibt es eine Möglichkeit, die Vorbereitung und die Ausführung in CNTK zu teilen, wie im Fall Theano?
Frage 2:
Ich bin zu Theano verwendet, aber völlig neu bei CNTK, so dass ich bin mir nicht ganz sicher, ob der CNTK Code zu dem Theano Code entspricht. Ich bin mir besonders nicht sicher, ob die Operation in der for-Schleife des CNTK-Codes tatsächlich im Gerät eingeschlossen ist, da prod.eval() ein numpy.darray zurückgibt. Fehle ich etwas?
-Code verwendet, um die Zeitpunkte zu messen:
import numpy as np
import time
# theano
def test_matVecDot_theano(D, N):
import theano
import theano.tensor as T
A_cpu = np.random.normal(size=[D,D]).astype(np.float32)
x_cpu = np.random.normal(size=[D]).astype(np.float32)
A_gpu = theano.shared(A_cpu)
x_gpu = theano.shared(x_cpu)
b_gpu = theano.shared(x_cpu)
b_gpu_new = T.dot(A_gpu,x_gpu)
fnc = theano.function(inputs=[], outputs=None, updates=[(b_gpu, b_gpu_new)], allow_input_downcast=True)
tic = time.time()
for i in range(N):
fnc()
toc = time.time()
print("time_theano:",toc-tic)
# cntk
def test_matVecDot_CNTK(D, N):
import cntk as C
A_cpu = np.random.normal(size=[D,D]).astype(np.float32)
x_cpu = np.random.normal(size=[D,1]).astype(np.float32)
A_c = C.Parameter(init=A_cpu, dtype=np.float32)
x_c = C.Parameter(init=x_cpu, dtype=np.float32)
b_c = C.Parameter(init=x_cpu, dtype=np.float32)
prod = C.times(A_c, x_c)
tic = time.time()
for i in range(N):
b_c.value = prod.eval() # is this operation enclosed in the device?
toc = time.time()
print("time_cntk:",toc-tic)
Warum nicht 'nvprof' verwenden, um die Ausführungszeit des GPU-Kerns direkt zu messen? Obwohl ich bezweifle, dass es einen großen Unterschied geben wird, da sie einfach cuBLAS nennen. – Kh40tiK