2015-11-10 3 views
13

Je suis en train d'exécuter le mot intégration de code exemple à https://github.com/tensorflow/tensorflow/tree/master/tensorflow/g3doc/tutorials/word2vec (installé avec la version GPU de tensorflow sous Ubuntu 14.04), mais il renvoie le message d'erreur suivant:Fail pour exécuter Word intégrant par exemple dans le tutoriel de tensorflow avec les 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() 

Lorsque je lance le code dans la version tensorflow de la CPU, cela fonctionne très bien. Mais pas pour la version GPU. J'ai aussi essayé d'utiliser tf.device ('/ cpu: 0') pour le forcer en utilisant CUP au lieu de GPU, mais il produit la même sortie.

Y at-il une fonction dans cet exemple ne peut pas être exécuté dans les GPU? Et comment puis-je passer au CPU sans réinstaller la version CPU de tensorflow puisque tf.device ('/ cpu: 0') ne fonctionne pas? Scatter_sub est uniquement pris en charge sur cpu dans la version actuelle

Répondre

15

Il semble que tout un tas d'opérations utilisées dans cet exemple ne sont pas prises en charge sur un GPU. Une solution de contournement rapide consiste à limiter les opérations de manière à ce que seules les muls de matrice soient exécutées sur le GPU.

Il y a un exemple dans la documentation: http://tensorflow.org/api_docs/python/framework.md

Voir la section sur tf.Graph.device (device_name_or_function)

j'ai pu le faire fonctionner avec les éléments suivants:

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

Je vois. Merci! Une autre question est: est-ce que je peux utiliser plusieurs CPU/threads pour m'entraîner dans cet exemple? Même si je le spécifie en utilisant des processeurs, les informations de journalisation ne montrent toujours aucune information. à propos des processeurs/threads utilisés? – chentingpc

4
  • Je m'attends à ce que l'ajout de Ln119: avec tf.device ("/ cpu: 0") force tout pour utiliser cpus. Comment avez-vous utilisé tf.device?
+0

Oui , il fonctionne pour ajouter tf.device dans Ln119, je l'ai d'abord ajouté à Ln159 en début de session. Mais même si je l'ai forcé à utiliser cpus, il n'affiche toujours pas les informations sur le processeur, et combien de cœurs/threads peut-il utiliser? – chentingpc

+0

local_device.cc:25] Fils de parallélisme intra-op du périphérique local: 12 local_session.cc:45] Fils de parallélisme inter op de session locale: 12 montre que TF détecte que vous avez 12 processeurs '' et qu'il peut tirer parti de ces avantages concurrentiels (de façon lâche). La concurrence réelle disponible dépend de la configuration du programme TF. Vous pouvez indiquer à TF d'utiliser X nombre de threads via SessionOptions. En outre, si vous exécutez word2vec_optimized, vous devez vous attendre à voir tous les processeurs occupés. – zfc

+0

Donc, avec la version de base, il a utilisé autant de threads qu'il peut (ce qui était environ trois ou quatre threads que je me souviens)? Afin d'utiliser plus de parallélisme CPU, il n'y a pas de manière automatique, mais il faut le faire correctement? – chentingpc