2 votes

Le code CPU peut-il exister sous "with tf.device(gpu_id) :" dans le cas de plusieurs GPU ?

Bonjour, je suis nouveau dans Tensorflow et on m'a assigné une tâche pour changer le "Demo.py" dans un projet Github "tf-faster-rcnn" pour atteindre l'inferencing multi-GPU.

Et c'est généralement ce que je prévois de faire (supposons que le nombre d'images que j'ai est le même que le nombre de GPU, et que j'utiliserai une file d'attente qui n'est pas illustrée ici pour des raisons de simplicité) :

for id, gpu in gpu_dict:
    with tf.device(gpu):
        im_detect(images[id])

La fonction "im_detect" est fournie dans le fichier source (je peux l'appeler directement) et elle contient du code non-GPU (comme les conditions et la préparation des données).

def im_detect(sess, net, im):
  blobs, im_scales = _get_blobs(im)
  assert len(im_scales) == 1, "Only single-image batch implemented"

  im_blob = blobs['data']
  blobs['im_info'] = np.array([im_blob.shape[1], im_blob.shape[2], im_scales[0]], dtype=np.float32)

  _, scores, bbox_pred, rois = net.test_image(sess, blobs['data'], blobs['im_info'])

  boxes = rois[:, 1:5] / im_scales[0]
  scores = np.reshape(scores, [scores.shape[0], -1])
  bbox_pred = np.reshape(bbox_pred, [bbox_pred.shape[0], -1])
  if cfg.TEST.BBOX_REG:
    # Apply bounding-box regression deltas
    box_deltas = bbox_pred
    pred_boxes = bbox_transform_inv(boxes, box_deltas)
    pred_boxes = _clip_boxes(pred_boxes, im.shape)
  else:
    # Simply repeat the boxes, once for each class
    pred_boxes = np.tile(boxes, (1, scores.shape[1]))

  return scores, pred_boxes

Comme je n'ai jamais joué avec les GPU et que je suis un débutant en Tensorflow, j'aimerais savoir s'il est possible d'assigner à chaque GPU un tel appel de fonction dans Tensorflow ?

----------------ceci est mis à jour------------------------

Je sais qu'il y a une option "alow_soft_placement" dans Tensorflow et que cela assigne ces codes non-GPU au CPU, mais quand il y a plusieurs GPU, comment un CPU peut-il gérer ces demandes de tous les GPU ? Dois-je créer un thread CPU pour chaque GPU ?

1voto

Joshua R. Points 1897

Oui. A partir de https://www.tensorflow.org/programmers_guide/using_gpu . Les allow_soft_placement dans la configuration de votre session permet à TensorFlow de se rabattre sur le processeur si une opération n'a pas de noyau CUDA.

myConf = tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)
sess = tf.Session(config=myConf)

Parfois, vous n'en aurez pas besoin, par exemple si vous essayez de vérifier que toutes les opérations prévues s'exécutent bien sur le GPU.

Vous pouvez également affecter explicitement des opérations à l'unité centrale à l'aide de la fonction with tf.device('/cpu:0'): à l'intérieur d'un with tf.device('/gpu:0'): bloc.

J'ai tendance à préférer utiliser un placement strict, puis à assigner explicitement les opérations incompatibles au processeur lorsque TensorFlow se plaint. De cette façon, je suis sûr que toutes les opérations appropriées sont optimisées pour le GPU.

UPDATE :

Voici un peu de code schématique qui devrait indiquer comment faire fonctionner des calculs parallèles sur des GPU.

graph = tf.Graph()

with graph.as_default():

gpus = ['/gpu:0', '/gpu:1']
results = []
datasets = []

for idx, gpu in enumerate(gpus):
   with tf.device(gpu):
       # assign data prep ops to CPU
       # (or use soft placement and leave out the next line).
       with tf.device('/cpu:0'):
            datasets[idx] = tf.placeholder(tf.float32, name = 'Features'+idx)

       # Computationally expensive ops get assigned to GPU, but make reference
       # to specific non-GPU ops on CPU.
       results[idx] = tf.reduce_sum(datasets[idx])  

myConf = tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)

with tf.Session(graph=graph, config=myConf) as session:

    # Now, using the graph set up previously, evaluate results
    # using both gpu devices (each these ops depends on independent
    # cpu ops).
    res0, res1 = session.run([results[0], results[1]])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X