0

私はMATLABで畳み込みネットワークを実装しています.GPUのサポートを追加しました(gpuArraysを使用しています)。フィードフォワード部分を実装しました。私は標準の配列(私は既に自分のワークスペースの準備ができている配列を持っている)でそれを実行すると、0.15秒かかります。しかし、私が同じことを実行しても、フィードフォワードスクリプトを実行する前にすべてのワークスペースにある配列gpuArraysを実行すると、〜1.39秒かかります。誰かがここで何が起こっているのか説明できますか?私は時間を実行しているテストし、主なボトルネックが私の畳み込み一部であることすべてが示唆ので、私がダウンして、ここでのコードの一部を貼り付けます:おかげで標準アレイは、convネットフィードフォワードのgpuArrayよりも高速です。

UPDATE

  pad = (size(layers_W{layerNum}, 1)-1)/2; 

      for imageNum = 1:options.minibatchSize 
       for filterNum = 1:size(layers_W{layerNum}, 4) 
        for filterD = 1:size(layers_W{layerNum}, 3) 
         c = conv2(convInput(:, :, filterD, imageNum), ... 
          rot90(layers_W{layerNum}(:, :, filterD, filterNum), 2), 'valid'); 
         layers_activations{layerNum}(pad+1:end-pad, pad+1:end-pad, filterNum, imageNum) = ... 
          layers_activations{layerNum}(pad+1:end-pad, pad+1:end-pad, filterNum, imageNum) + ... 
          c; 
        end 

        layers_activations{layerNum}(pad+1:end-pad, pad+1:end-pad, filterNum, imageNum) = ... 
          layers_activations{layerNum}(pad+1:end-pad, pad+1:end-pad, filterNum, imageNum) + ... 
          layers_b{layerNum}(filterNum); 
       end 
      end 

      if strcmp(options.activation, 'relu') == 1 
       layers_activations{layerNum} = max(0, layers_activations{layerNum}); 
      elseif strcmp(options.activation, 'sigmoid') == 1 
       layers_activations{layerNum} = 1 ./ (1 + exp(-layers_activations{layerNum})); 
      end 

このコードの正確な作品は、ですCPUよりもGPUで約52倍遅い何か案は?

UPDATE2: 2dコンボリューション(GPUでは約10倍遅くなります)とその下に2つの行列を追加する行(GPUでは約100倍遅い)を別々にテストしました。なぜこれが起こっているのか、私は完全に混乱しています。

+1

データがGPUに移動するのに時間がかかります。 GPUで計算するのに十分な計算量がない場合(そうでないように見えます)、CPUは実際より高速になります。 –

+0

それはGPUメモリ内にあるべきではありませんか?他のスクリプトはこれらのベクトルとすべてを作成し、フィードフォワードを実行する前にワークスペースに座っています。私は自分のGPUがメモリ内にこれを保持するのに十分なメモリを持っていることを絶対に確信しています(6GB、小規模なネットワーク上のテストのみ)。 –

+0

GPUのすべてが高速です。最も遅い部分が何であるかを見るためにコードをプロファイルします。また、コード全体を表示しない限り、私たちはあなたを助けることが難しい –

答えて

2

これはまったく驚くことではありません。 GPUは、大きな画像(HD、4K)で畳み込みを行うのに効率的ですが、特にCNNで典型的な227x227以下の画像では効率的ではありません。すべてのフィルタとすべての画像をループするのではなく、1回の呼び出しで各入力アクティベーションですべてのフィルタを適用できるように、少なくとも3次元コンボリューションを実行する必要があります。内部ループをconvnへの呼び出しで置き換えてください。

MATLABのNeural Network Toolboxで使用されているようなコンボリューションのスマートGPU実装では、カスタムカーネルとマルチスレッドを使用してフィルタと入力のバッチディメンションの空間並列性と並列性を利用します。あなたの実装はすべてのバッチ並列性を放棄します。

+0

あなたの答えをありがとう。これらの実装について知ることができるソースや、これらのスマートな組み込み畳み込みやその他の操作を使用できる方法を知っていますか? –

+0

https://www.mathworks.com/help/nnet/deep-learning.html –

関連する問題