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 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> B code> à chaque valeur d'entrée.
add_b_op.cc code>: p>
add_b_op.cu.cc code> 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)
3 Réponses :
Je pense que les instanciations de modèle peuvent être incorrectes: et ensuite: p> 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). p> Vous pouvez probablement résoudre ce problème en appelant addbop
Merci pour votre réponse. Tant que cpudevice code> et
GPUDEvice code> 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 code> et
addbgpuop code>, et j'observe le même comportement. (J'ai édité ma question à inclure le code modifié.)
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)
Salut Florent, merci de votre réponse. Je viens d'essayer votre script qui utilise config.gpu_options.allow_growth = true code> 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') code>, 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!
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: p>
Optimisation du graphique désactivé: p>
n'utilise pas les constantes, par exemple, d'alimenter les valeurs en espaces réservés: P>