私はTheanoとCNTKの性能を非常に簡単なタスク、GPUのマトリックスベクトルプロダクトと比較したいと考えています。私はTheano 0.9.0とCNTK 2.0を使用しています。TheanoとCNTKのベンチマークGPUの単純マトリクスベクトルプロダクト
ホストからデバイスへのデータ転送に使用される時間を除いて、デバイスでの計算に費やされる時間を測定したい、またはその逆を測定したいとします。 figure (timings theano vs cntk) (Nは繰り返し数であるD、行列のサイズは、10000に設定されました。)
質問1:
それ私が得た
結果はこのようなものでしたいくつかの準備(計算グラフをコンパイルするために使用される)のような時間は、CNTKの場合のmat-vec製品の最初の実行に含まれているようです。 CNTKで準備と実行を分割する方法はありますか?それはTheanoの場合のようですか?
質問2:
私はTheanoに使用されるが、CNTKで全く新しいので、私はCNTKコードはTheanoのコードと同等であればかなりわからないのです。 prod.eval()がnumpy.ndarrayを返すので、CNTKコードのforループの操作が実際にデバイスに閉じ込められているかどうかは特にわかりません。何か不足していますか?タイミングを測定するために使用される
コード:
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)
なぜGPUカーネルの実行時間を直接測定するために 'nvprof'を使用しないのですか?単にcuBLASと呼ぶだけで大きな違いはないとは思うが、 – Kh40tiK