2016-05-25 4 views
2

integerテンソルで初期化すると、Variable opのGPUカーネルは存在しないようです。たとえば、ランニング:int32変数opのGPUカーネルなし

with tf.device('/gpu:0'): 
    var = tf.Variable(initial_value=([[1,2],[3,4]])) 
sess = tf.Session() 
sess.run(var) 

は、例外が発生します:

tensorflow.python.framework.errors.InvalidArgumentError: Cannot assign a device to node 'Variable': Could not satisfy explicit device specification '/device:GPU:0' because no supported kernel for GPU devices is available 

が、これはTensorFlowのすべての変数は、CPUデバイス(私は推測RAM)に関連付けられたメモリに保存されていることを意味していますGPUメモリではない?変数値がRAMからGPUメモリに何度もコピーされなければならないので、1つのGPUだけを使用してモデルを訓練したいとき、それは遅くなりませんか?

ありがとうございます!

答えて

3

TL; DR:ありGPU上の変数OPSを-valued int32ためないカーネルはありませんが、他の要素タイプ(float16/float32/float64)はGPU上で支持されています。


TensorFlowは、現在だけ(half-, single-, and double-precision)浮動小数点variables on GPUをサポートしています。確かに、一般的には、TensorFlowは、GPU上int32操作のための限定的なサポートを持っており、あなたがこのthroughout the C++ codeような興味深いコメントが表示されます:「

// A special GPU kernel for int32. 
// TODO(b/25387198): Also enable int32 in device memory. This kernel 
// registration requires all int32 inputs and outputs to be in host memory. 

これは、GPU上int32データに対する操作を実行するために、特に難しいことではありませんので、なぜdoesnのt TensorFlowはそれをサポートしていますか?

  1. TensorFlowのデフォルトの配置アルゴリズムは、その操作のための「可能な限りの」デバイスに貪欲に操作を置きます。これは、GPU上にある場合はGPU上、それ以外の場合はCPU上にあることを意味します。
  2. 経験的には、実際のモデルではほとんどint32の演算が「メタデータ」(テンソルの形など)を生成して消費し、この情報は通常はホストメモリ内にあることがわかりました。これらの操作は、可変サイズのテンソルを処理するために、グラディエントコードで切り上げます。
  3. int32カーネルをGPUに登録すると、通常は非常に安価な操作を実行するために、これらの小さなメタデータのテンソルをデバイスメモリとの間でコピーする必要があります。さらに、結果をホストメモリにコピーすると、GPUストリームが停止し、パフォーマンスが大幅に低下します。その結果

我々は操作がGPU上で実行されているの恩恵を受けていない場合に認識することができ、よりスマートな配置アルゴリズムを開発しながら、我々は、多くのint32カーネルの登録を削除する妥協案を作りました。 GPUにはint32のオペレーションはほとんど登録されていないので、GPUに変数を持たせることはほとんどまたはまったくないので、比較的乏しいメモリを消費します。

+2

プレースメント戦略が改善されましたか?私は0.11であり、これと同じ問題です...私の最大の不満は、 'embedding_lookup'も' int32'パラメータ( 'tf.slice'など)を持っているので、RNNs GPU上で完全に実行されることはありません。 –

関連する問題