2015-11-10 14 views
13

Sto cercando di eseguire la parola incorporazione del codice esempio a https://github.com/tensorflow/tensorflow/tree/master/tensorflow/g3doc/tutorials/word2vec (installato con la versione di GPU di tensorflow sotto Ubuntu 14.04), ma restituisce il seguente messaggio di errore:Fail per eseguire Word embedding esempio in tensorflow tutorial con le GPU

Found and verified text8.zip 
Data size 17005207 
Most common words (+UNK) [['UNK', 418391], ('the', 1061396), ('of', 593677), ('and', 416629), ('one', 411764)] 
Sample data [5239, 3084, 12, 6, 195, 2, 3137, 46, 59, 156] 
3084 -> 12 
originated -> as 
3084 -> 5239 
originated -> anarchism 
12 -> 3084 
as -> originated 
12 -> 6 
as -> a 
6 -> 12 
a -> as 
6 -> 195 
a -> term 
195 -> 6 
term -> a 
195 -> 2 
term -> of 
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 12 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:88] Found device 0 with properties: 
name: GeForce GTX TITAN X 
major: 5 minor: 2 memoryClockRate (GHz) 1.076 
pciBusID 0000:03:00.0 
Total memory: 12.00GiB 
Free memory: 443.32MiB 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:88] Found device 1 with properties: 
name: GeForce GTX TITAN X 
major: 5 minor: 2 memoryClockRate (GHz) 1.076 
pciBusID 0000:05:00.0 
Total memory: 12.00GiB 
Free memory: 451.61MiB 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:112] DMA: 0 1 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:122] 0: Y Y 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:122] 1: Y Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:643] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX TITAN X, pci bus id: 0000:03:00.0) 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:643] Creating TensorFlow device (/gpu:1) -> (device: 1, name: GeForce GTX TITAN X, pci bus id: 0000:05:00.0) 
I tensorflow/core/common_runtime/gpu/gpu_region_allocator.cc:47] Setting region size to 254881792 
I tensorflow/core/common_runtime/gpu/gpu_region_allocator.cc:47] Setting region size to 263835648 
I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 12 
Initialized 
Traceback (most recent call last): 
    File "word2vec_basic.py", line 171, in <module> 
    _, loss_val = session.run([optimizer, loss], feed_dict=feed_dict) 
    File "/home/chentingpc/anaconda/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 345, in run 
    results = self._do_run(target_list, unique_fetch_targets, feed_dict_string) 
    File "/home/chentingpc/anaconda/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 419, in _do_run 
    e.code) 
tensorflow.python.framework.errors.InvalidArgumentError: Cannot assign a device to node 'GradientDescent/update_Variable_2/ScatterSub': Could not satisfy explicit device specification '' because the node was colocated with a group of nodes that required incompatible device '/job:localhost/replica:0/task:0/GPU:0' 
    [[Node: GradientDescent/update_Variable_2/ScatterSub = ScatterSub[T=DT_FLOAT, Tindices=DT_INT64, use_locking=false](Variable_2, gradients/concat_1, GradientDescent/update_Variable_2/mul)]] 
Caused by op u'GradientDescent/update_Variable_2/ScatterSub', defined at: 
    File "word2vec_basic.py", line 145, in <module> 
    optimizer = tf.train.GradientDescentOptimizer(1.0).minimize(loss) 
    File "/home/chentingpc/anaconda/lib/python2.7/site-packages/tensorflow/python/training/optimizer.py", line 167, in minimize 
    name=name) 
    File "/home/chentingpc/anaconda/lib/python2.7/site-packages/tensorflow/python/training/optimizer.py", line 256, in apply_gradients 
    update_ops.append(self._apply_sparse(grad, var)) 
    File "/home/chentingpc/anaconda/lib/python2.7/site-packages/tensorflow/python/training/gradient_descent.py", line 40, in _apply_sparse 
    return var.scatter_sub(delta, use_locking=self._use_locking) 
    File "/home/chentingpc/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/variables.py", line 324, in scatter_sub 
    use_locking=use_locking) 
    File "/home/chentingpc/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/gen_state_ops.py", line 227, in scatter_sub 
    name=name) 
    File "/home/chentingpc/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/op_def_library.py", line 633, in apply_op 
    op_def=op_def) 
    File "/home/chentingpc/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1710, in create_op 
    original_op=self._default_original_op, op_def=op_def) 
    File "/home/chentingpc/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 988, in __init__ 
    self._traceback = _extract_stack() 

Quando eseguo il codice nella versione della CPU di tensorflow, funziona perfettamente. Ma non per la versione GPU. Ho anche provato a usare tf.device ('/ cpu: 0') per forzarlo usando CUP invece di GPU, ma produce lo stesso output.

C'è qualche funzione in questo esempio che non può essere eseguita in GPU? E come passare alla CPU senza reinstallare la versione della CPU di tensorflow dal momento che tf.device ('/ cpu: 0') non funziona?

risposta

15

Sembra che un gruppo di operazioni utilizzate in questo esempio non siano supportate su una GPU. Una soluzione rapida consiste nel limitare le operazioni in modo che solo le matrici matrice vengano eseguite sulla GPU.

C'è un esempio nella documentazione: http://tensorflow.org/api_docs/python/framework.md

si veda la sezione tf.Graph.device (device_name_or_function)

ero in grado di farlo funzionare con il seguente:

def device_for_node(n): 
    if n.type == "MatMul": 
    return "/gpu:0" 
    else: 
    return "/cpu:0" 

with graph.as_default(): 
    with graph.device(device_for_node): 
    ... 
+0

Vedo. Grazie! Un'altra domanda è possibile utilizzare più CPU/thread per l'allenamento in questo esempio? Anche se lo specifico utilizzando le CPU, le informazioni di registrazione non mostrano ancora alcuna informazione. sulle CPU/thread utilizzati? – chentingpc

4
  • scatter_sub è supportato solo su cpu nella versione corrente.
  • Mi aspetto che l'aggiunta su Ln119: con tf.device ("/ cpu: 0") dovrebbe forzare tutto per utilizzare cpus. Come hai usato tf.device?
+0

Sì , funziona per aggiungere tf.device in Ln119, inizialmente l'ho aggiunto a Ln159 all'inizio della sessione. Ma anche io l'ho forzato ad usare cpus, non mostrava ancora informazioni sulla CPU e quanti core/thread cpus possono usare? – chentingpc

+0

local_device.cc:25] Thread di parallelismo op interno del dispositivo locale: 12 local_session.cc:45] Thread di parallelismo di sessione locale di sessione: 12 mostra che TF rileva che hai 12 cpus '' e può sfruttare questa concomitanza molto (in senso lato). La concomitanza effettiva disponibile dipende dalla configurazione del programma TF. Puoi dire a TF di usare il numero X di thread tramite SessionOptions. Inoltre, se esegui word2vec_optimized, dovresti aspettarti di vedere tutte le CPU occupate. – zfc

+0

Quindi, con la versione base, ha usato quanti più thread possibile (che erano circa tre o quattro thread che posso ricordare)? Per utilizzare più parallelismo della CPU, non esiste un modo automatico, ma è necessario realizzarlo a mano? – chentingpc