2017-08-20 3 views
1

Ist die Optimierung von Sparse_tensor_dense_matmul Betrieb in Tensorflow auf GPU möglich? Ich benutze tensoflow 1.2.1 mit CUDA 8. Fehler Beispiel:Tensorflow-Optimierung Sparse_tensor_dense_matmul Betrieb auf GPU

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)) 

Ergebnisse in dem folgenden Fehler:

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

Ich habe eine Feature-Anfrage hinzugefügt: https://github.com/tensorflow/tensorflow/issues/12475 – Stepochkin

Antwort

0

Es kann sinnvoll sein, hart Gerät Platzierung zu deaktivieren:

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)) 

Sie können auch log device placements, , die nützlich sein, um herauszufinden, ob die Kernels, die Sie interessieren, auf dem G sind PU.

Es gibt host memory fake GPU kernels registered for int32 strided slice, aber nicht für int64. Ich würde eine Pull-Anfrage/Feature-Anfrage auf Github öffnen, um int64 Host-Speicher-Kernel hinzuzufügen (effektiv nur die int32-Versionen zu kopieren), wenn Sie eine Hard-Device-Platzierung benötigen/wollen.

Für den Hintergrund wird schrittweises Segment im Gradienten von SparseTensorDenseMatMul verwendet. Es gibt im Allgemeinen keinen Vorteil, diese Art von Indexierungsoperationen auf der GPU auszuführen, daher werden sie als GPU-Kernel registriert, die auf der CPU ausgeführt werden, um die Art von Hardwareplazierungsbuchhaltungsproblemen zu vermeiden, auf die Sie gestoßen sind.