10
votes

Pourquoi la mise en œuvre de la CPU de mon OP personnalisé est-il sélectionné?

Pour apprendre à écrire sur mesure Tensorflow ops, j'ai suivi le Ajout d'une nouvelle op tutoriel et a créé un op de "add_b" qui ajoute un scalaire B code> à chaque valeur d'entrée.

add_b_op.cc code>: p> xxx pré>

add_b_op.cu.cc code> p> xxx pré>

J'ai intentionnellement introduit une erreur dans la mise en œuvre de la CPU Pour pouvoir distinguer si la CPU ou la mise en œuvre du processeur est utilisée. p>

Lorsque je teste mon op personnalisé avec: p>

from __future__ import print_function
import numpy as np
import tensorflow as tf
from time import time

NUM_VALUES = 1310720

input = np.arange(0, NUM_VALUES, dtype = float)

module = tf.load_op_library('custom_ops.so')
with tf.Session(config = tf.ConfigProto(log_device_placement = True)):
  start = time(); print(module.add_b(input, 8.).eval()); end = time(); print(end - start)


0 commentaires

3 Réponses :


2
votes

Je pense que les instanciations de modèle peuvent être incorrectes: xxx

et ensuite: xxx

Je pense que l'enregistrement de addb pour les instanciates de GPU L'objet qui correspond à la première mise en œuvre, pas la seconde (la première mise en œuvre comporte deux arguments de modèle, la deuxième mise en œuvre en a une).

Vous pouvez probablement résoudre ce problème en appelant addbop dans la deuxième enregistrement, Bien que je conseille de mieux éviter la confusion.


1 commentaires

Merci pour votre réponse. Tant que cpudevice et GPUDEvice sont en réalité différents types, je pense que la spécialisation de modèle irait bien . Quoi qu'il en soit, je suis maintenant maintenant essayé de modifier les noms de classe sur addbcpuop et addbgpuop , et j'observe le même comportement. (J'ai édité ma question à inclure le code modifié.)



0
votes

Selon Ce il peut être dû Pour la résolution de la fragmentation de la mémoire, essayez:

from __future__ import print_function
import numpy as np
import tensorflow as tf
from time import time

NUM_VALUES = 10

input = np.arange(0, NUM_VALUES, dtype = float)

custom_ops_module = tf.load_op_library('custom_ops.so')

config = tf.ConfigProto(log_device_placement = True)
config.gpu_options.allow_growth = True

with tf.Session(config = config):
    start = time(); print(custom_ops_module.add_b(input, 8.).eval()); end = time(); print(end - start)


2 commentaires

Salut Florent, merci de votre réponse. Je viens d'essayer votre script qui utilise config.gpu_options.allow_growth = true et je constate que la mise en œuvre de la CPU est toujours sélectionnée. J'ai également essayé de placer le code dans avec tf.device ('/ GPU: 0') , mais la mise en œuvre du GPU n'est pas sélectionnée.


Ok, c'était ma première devin et je n'avais pas les moyens de reproduire la question hier. Heureux que tu as résolu, et j'ai appris quelque chose!



3
votes

Je viens de lire TENSORFLOW Numéro n ° 2054 - Placement manuel sur GPU d'un opérateur personnalisé avec la CPU et la mise en œuvre du GPU exécutera toujours la version de la CPU et le comportement d'exécution de la mise en œuvre de la CPU semble être une fonctionnalité de TENSOREFLOW appelée "pliage constant". Lorsque TensorFlow optimise le graphique avant la première exécution, les OP impliquant des constantes sont généralement évaluées sur la CPU, comme la pensée est que la CPU et les implémentations GPU devraient produire les mêmes résultats. A du sens.

Deux façons de désactiver ce comportement sont les suivants:

  1. Optimisation du graphique désactivé: XXX

  2. n'utilise pas les constantes, par exemple, d'alimenter les valeurs en espaces réservés: XXX


0 commentaires