Tensorflow: GraphDef не может быть больше 2 ГБ. ошибка при сохранении модели после присвоения переменных

Я хочу использовать предварительно обученную модель, чтобы тепло запустить другую модель с небольшой разницей. Просто я создаю новую модель и присваиваю переменным с одинаковым именем предварительно обученные веса модели. Но при сохранении модели произошла ошибка.

Traceback (most recent call last): File "tf_test.py", line 23, in <module> save_path = saver.save(sess, "./model.ckpt") File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/saver.py", line 1308, in save self.export_meta_graph(meta_graph_filename) File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/saver.py", line 1331, in export_meta_graph graph_def=ops.get_default_graph().as_graph_def(add_shapes=True), File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2268, in as_graph_def result, _ = self._as_graph_def(from_version, add_shapes) File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2231, in _as_graph_def raise ValueError("GraphDef cannot be larger than 2GB.") ValueError: GraphDef cannot be larger than 2GB.

Пример кода выглядит следующим образом:

import tensorflow as tf
import numpy as np

v1 = tf.get_variable("L_enc", [400000, 1024])
v2 = tf.get_variable("L_dec", [400000, 1024])

init_op = tf.initialize_all_variables()

saver = tf.train.Saver(tf.all_variables())

with tf.Session() as sess:
  sess.run(init_op)
  for v in tf.trainable_variables():
    embedding = np.random.uniform(-1, 1, (400000, 1024))
    sess.run(v.assign(embedding))
  # Save the variables to disk.
  save_path = saver.save(sess, "./model.ckpt")
  print("Model saved in file: %s" % save_path)

person hankaixyz    schedule 22.02.2017    source источник


Ответы (2)


Фабрицио правильно указывает, что существует жесткое ограничение в 2 ГБ на размер буферов протокола, но вам может быть интересно, почему ваша программа достигает этого предела. Проблема связана с этими строками:

for v in tf.trainable_variables():
  embedding = np.random.uniform(-1, 1, (400000, 1024))
  sess.run(v.assign(embedding))

Когда выполнение достигает v.assign(embedding), в граф TensorFlow добавляются новые узлы. В частности, каждый массив embedding преобразуется в тензор tf.constant(), который будет довольно большой (примерно 328 МБ по моей оценке).

Лучший способ избежать этого — загрузить переменные из предыдущей модели непосредственно в новую модель с помощью tf.train.Saver. Поскольку модели могут иметь различную структуру, вам может потребоваться указать сопоставление имен переменных в старой модели с tf.Variable объектами в вашей новой модели.


Альтернативным способом решения вашей проблемы было бы предварительное создание операции tf.placeholder() для присвоение значения каждой переменной. Это может потребовать дополнительной реструктуризации вашего фактического кода, но для меня сработало следующее:

v1 = tf.get_variable("L_enc", [400000, 1024])
v2 = tf.get_variable("L_dec", [400000, 1024])

# Define a separate placeholder and assign op for each variable, so
# that we can feed the initial value without adding it to the graph.
vars = [v1, v2]
placeholders = [tf.placeholder(tf.float32, shape=[400000, 1024]) for v in vars]
assign_ops = [v.assign(p) for (v, p) in zip(vars, placeholders)]

init_op = tf.global_variables_initializer()

saver = tf.train.Saver(tf.all_variables())

with tf.Session() as sess:
  sess.run(init_op)
  for p, assign_op in zip(placeholders, assign_ops):
    embedding = np.random.uniform(-1, 1, (400000, 1024))
    sess.run(assign_op, {p: embedding})

  # Save the variables to disk.
  save_path = saver.save(sess, "./model.ckpt")
  print("Model saved in file: %s" % save_path)
person mrry    schedule 20.03.2017
comment
Трюк с плейсхолдером сработал в моем случае, но, к сожалению, производительность резко упала — есть ли планы по снятию этого ограничения? - person Mr_and_Mrs_D; 26.06.2017

Существует жесткое ограничение в 2 ГБ для сериализации отдельных тензоров из-за 32-битного размера со знаком в protobuf.

https://github.com/tensorflow/tensorflow/issues/4291

person fabrizioM    schedule 22.02.2017