2016-09-02 1 views
1

j'ai essayé d'exécuter le graphique suivant: Graph that causes the error.Tensor trop grand pour la distribution graphique - "InternalError: longueur du message a été négatif"

Malheureusement, je reçois le message d'erreur suivant:

tensorflow.python.framework.errors.InternalError: Message length was negativ 
[[Node: random_uniform_1_S1 = _Recv[client_terminated=false, 
    recv_device= "/job:worker/replica:0/task:1/cpu:0", 
    send_device="/job:worker/replica:0/task:0/cpu:0", 
    send_device_incarnation=3959744268201087672, 
    tensor_name="edge_18_random_uniform_1", 
    tensor_type=DT_DOUBLE, 
    _device="/job:worker/replica:0/task:1/cpu:0"]()]] 

J'ai remarqué que ce message d'erreur ne se produit pas si la taille de random_uniform_1 est de 800 Mo, mais cela se produit si la taille est de 8 Go.

(Notez que random_uniform_1 doit être transféré d'un appareil à un autre.)

Question: est-il une limite sur la taille d'un tenseur peut être, si ce tenseur doit être transféré entre les appareils?

Répondre

2

Oui, il existe actuellement une limite 2GB sur un tenseur individuel lors de l'envoi entre processus. Cette limite est imposée par la représentation du tampon de protocole (plus précisément, par les wrappers C++ auto-générés produits par le compilateur protoc) utilisé dans la couche de communication de TensorFlow. Nous étudions des moyens de lever cette restriction. En attendant, vous pouvez contourner ce problème en ajoutant manuellement les opérations tf.split() ou tf.slice() et tf.concat() pour partitionner le tenseur en vue d'un transfert. Si vous avez de très gros objets tf.Variable, vous pouvez utiliser variable partitioners pour effectuer cette transformation automatiquement. Notez que dans votre programme vous avez plusieurs tenseurs de 8 Go en mémoire à la fois, donc l'utilisation maximale de la mémoire sera d'au moins 16 Go.