2017-08-20 9 views
1

sparse_tensor_dense_matmul演算をGPUのテンソルフローで最適化できますか?私はCUDA 8 エラー例で1.2.1 tensoflow使用 :次のエラーでGPUのテンソルフローを最適化するsparse_tensor_dense_matmul操作

import tensorflow as tf 

with tf.device('/gpu:0'): 
    st = tf.SparseTensor(
     tf.constant([[0, 0], [1, 1]], dtype=tf.int64), 
     tf.constant([1.2, 3.4], dtype=tf.float32), 
     tf.constant([2, 2], dtype=tf.int64) 
    ) 
    v = tf.Variable([[1.0, 0.0], [0.0, 1.0]], dtype=tf.float32) 
    st = tf.sparse_tensor_dense_matmul(st, v) 
    st = tf.reduce_min(st) 
    optimizer = tf.train.AdamOptimizer() 
    trainer = optimizer.minimize(st) 

with tf.Session() as sess: 
    print(sess.run(trainer)) 

結果:

Traceback (most recent call last): 
    File "test_tf3.py", line 18, in <module> 
    print(sess.run(trainer)) 
    File "/media/awork/home/astepochkin/drecs/repo/env/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 895, in run 
    run_metadata_ptr) 
    File "/media/awork/home/astepochkin/drecs/repo/env/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1124, in _run 
    feed_dict_tensor, options, run_metadata) 
    File "/media/awork/home/astepochkin/drecs/repo/env/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1321, in _do_run 
    options, run_metadata) 
    File "/media/awork/home/astepochkin/drecs/repo/env/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1340, in _do_call 
    raise type(e)(node_def, op, message) 
tensorflow.python.framework.errors_impl.InvalidArgumentError: Cannot assign a device for operation 'gradients/SparseTensorDenseMatMul/SparseTensorDenseMatMul_grad/strided_slice_1': Could not satisfy explicit device specification '/device:GPU:0' because no supported kernel for GPU devices is available. 
    [[Node: gradients/SparseTensorDenseMatMul/SparseTensorDenseMatMul_grad/strided_slice_1 = StridedSlice[Index=DT_INT32, T=DT_INT64, begin_mask=1, ellipsis_mask=0, end_mask=1, new_axis_mask=0, shrink_axis_mask=2, _device="/device:GPU:0"](Const, gradients/SparseTensorDenseMatMul/SparseTensorDenseMatMul_grad/strided_slice_1/stack, gradients/SparseTensorDenseMatMul/SparseTensorDenseMatMul_grad/strided_slice_1/stack_1, gradients/SparseTensorDenseMatMul/SparseTensorDenseMatMul_grad/strided_slice_1/stack_2)]] 
+0

フィーチャーリクエストを追加しました: https://github.com/tensorflow/tensorflow/issues/12475 – Stepochkin

答えて

0

それは、ハードデバイスの配置を無効にするには意味をなさない可能性があります

import tensorflow as tf 

with tf.device('/gpu:0'): 
    st = tf.SparseTensor(
     tf.constant([[0, 0], [1, 1]], dtype=tf.int64), 
     tf.constant([1.2, 3.4], dtype=tf.float32), 
     tf.constant([2, 2], dtype=tf.int64) 
    ) 
    v = tf.Variable([[1.0, 0.0], [0.0, 1.0]], dtype=tf.float32) 
    st = tf.sparse_tensor_dense_matmul(st, v) 
    st = tf.reduce_min(st) 
    optimizer = tf.train.AdamOptimizer() 
    trainer = optimizer.minimize(st) 

with tf.Session(config=tf.ConfigProto(allow_soft_placement=True)) as sess: 
    sess.run(tf.global_variables_initializer()) 
    print(sess.run(trainer)) 

また、log device placements、 もあります。気になるカーネルがGにあるかどうかを判断するのに役立ちますPU。

host memory fake GPU kernels registered for int32 strided sliceがありますが、int64ではありません。ハードデバイスの配置が必要/必要な場合は、int64ホストメモリカーネル(効果的にはint32のバージョンをコピーする)を追加するGithubのプルリクエスト/機能リクエストを開きます。

グラディエントでストライドスライスが使用されているのは、SparseTensorDenseMatMulです。これらの種類のインデックス作成操作をGPUで実行すると、一般的にメリットはありません。そのため、CPUで実行されるGPUカーネルとして登録され、実行されたハードデバイス配置の簿記問題を回避できます。

関連する問題