2017-10-16 17 views
1

J'ai récemment remarqué une chose étrange, Tensorflow semble utiliser trop de mémoire lors de l'initialisation des variables avec des constantes. Quelqu'un peut-il m'aider à comprendre l'exemple ci-dessous?Tensorflow utilise trop de mémoire lors de l'initialisation avec des constantes

$ python -m memory_profiler test.py 
[0 1 2 3 4 5 6 7 8 9] 
Filename: test.py 

Line # Mem usage Increment Line Contents 
================================================ 
4 144.531 MiB 0.000 MiB @profile 
5        def go(): 
6 907.312 MiB 762.781 MiB a = np.arange(100000000) 
7 910.980 MiB 3.668 MiB s = tf.Session() 
8 1674.133 MiB 763.152 MiB b = tf.Variable(a) 
9 3963.000 MiB 2288.867 MiB s.run(tf.variables_initializer([b])) 
10 3963.145 MiB 0.145 MiB print(s.run(b)[:10]) 
+0

Je ne suis pas. De quelles «constantes» parlez-vous? Quel incrément de mémoire est faux? – hpaulj

+0

a est un tableau numpy constant de taille 100000000, je crée une variable tensorflow b et lui donne la valeur a, et appelle variables_initializer() pour initialiser b. a lui-même est de 762 Mo, donc b, ce que je ne comprends pas, c'est comment TF finit en utilisant 4 Go de mémoire. –

+0

'a' est un grand tableau (il n'y a rien de 'constant' à ce sujet). 'b' est un objet' tf' qui fait apparemment une copie des données 'a's'. La ligne 9 ajoute 3 'copies' de ces données - ou au moins fait 3 objets de taille similaire. Je ne sais pas si c'est l'étape 'initializer' ou la' run' qui le fait; peut-être les deux. – hpaulj

Répondre

2
  • Vous avez 900Mo stocké dans le tableau numpy. La variable (a) est équivalente à tf.Variable (tf.constant (a)). Pour créer cette constante, le client Python constante de 900MB ajoute au graphique objet dans l'exécution Python
  • Session.run déclenche TF_ExtendGraph qui transfère le graphique pour l'exécution tensorflow C, un autre 900MB
  • session de
  • alloue 900Mo pour btf.Variable objet dans l'exécution tensorflow

Cela fait 3600 Mo d'allocations de mémoire. Pour économiser de la mémoire, vous pouvez faire quelque chose comme ceci à la place

a_holder = tf.placeholder(np.float32) 
b = tf.Variable(a_holder) 
sess.run(b.initializer, feed_dict={a_holder: np.arange(100000000)}) 

TLDR; évitez de créer de grandes constantes.

+0

Merci beaucoup! En fait, je lisais juste la même solution de contournement que vous avez fournie dans un problème GitHub légèrement pertinent, de toute façon, cette réponse fournissait plus d'informations que ce commentaire, et je crois que c'est plus accessible pour les personnes cherchant le même problème. Merci! –