Размер файла Tensorflow SavedModel увеличивается с каждым сохранением - PullRequest
1 голос
/ 16 апреля 2019

У меня есть обучающий код Tensorflow R1.13, который периодически сохраняет SavedModel во время длительного тренировочного заезда (я следую этой превосходной статье 1002 * по этой теме).Я заметил, что каждый раз, когда модель сохраняется, размер увеличивается.На самом деле кажется, что каждый раз он увеличивается точно линейно и, по-видимому, кратен первоначальному размеру файла.Интересно, хранит ли TF ссылку на все предыдущие сохраненные файлы и накапливает их для каждого последующего сохранения?Ниже приведены размеры файлов для нескольких файлов SavedModel, записанных последовательно с течением времени в процессе обучения.

-rw-rw-r-- 1 ubuntu ubuntu  576962 Apr 15 23:56 ./model_accuracy_0.361/saved_model.pb
-rw-rw-r-- 1 ubuntu ubuntu 1116716 Apr 15 23:58 ./model_accuracy_0.539/saved_model.pb
-rw-rw-r-- 1 ubuntu ubuntu 1656470 Apr 16 00:11 ./model_accuracy_0.811/saved_model.pb
-rw-rw-r-- 1 ubuntu ubuntu 2196440 Apr 16 00:15 ./model_accuracy_0.819/saved_model.pb
-rw-rw-r-- 1 ubuntu ubuntu 2736794 Apr 16 00:17 ./model_accuracy_0.886/saved_model.pb
-rw-rw-r-- 1 ubuntu ubuntu 3277150 Apr 16 00:19 ./model_accuracy_0.908/saved_model.pb
-rw-rw-r-- 1 ubuntu ubuntu 3817530 Apr 16 00:21 ./model_accuracy_0.919/saved_model.pb
-rw-rw-r-- 1 ubuntu ubuntu 4357950 Apr 16 00:25 ./model_accuracy_0.930/saved_model.pb
-rw-rw-r-- 1 ubuntu ubuntu 4898492 Apr 16 00:27 ./model_accuracy_0.937/saved_model.pb

Есть ли способ исключить предыдущие сохраненные версии?Или, по крайней мере, предотвратить их накопление в первую очередь?Я, конечно, сохраню только последний файл, но он кажется в 10 раз больше, чем должен быть.

Ниже приведен мой код (в основном скопированный с Silva ):

        # Creates the TensorInfo protobuf objects that encapsulates the input/output tensors
        tensor_info_input_data_1 = tf.saved_model.utils.build_tensor_info(gd.data_1)
        tensor_info_input_data_2 = tf.saved_model.utils.build_tensor_info(gd.data_2)
        tensor_info_input_keep   = tf.saved_model.utils.build_tensor_info(gd.keep  )

        # output tensor info
        tensor_info_output_pred = tf.saved_model.utils.build_tensor_info(gd.targ_pred_oneh)
        tensor_info_output_soft = tf.saved_model.utils.build_tensor_info(gd.targ_pred_soft)

        # Define the SignatureDef for this export
        prediction_signature = \
            tf.saved_model.signature_def_utils.build_signature_def(
                inputs={
                    'data_1': tensor_info_input_data_1,
                    'data_2': tensor_info_input_data_2,
                    'keep'  : tensor_info_input_keep
                },
                outputs={
                    'pred_orig': tensor_info_output_pred,
                    'pred_soft': tensor_info_output_soft
                },
                method_name=tf.saved_model.signature_constants.CLASSIFY_METHOD_NAME)

        graph_entry_point_name = "my_model" # The logical name for the model in TF Serving

        try:
            builder = tf.saved_model.builder.SavedModelBuilder(saved_model_path)
            builder.add_meta_graph_and_variables(
                sess= sess,
                tags=[tf.saved_model.tag_constants.SERVING],
                signature_def_map = {graph_entry_point_name:prediction_signature}
            )
            builder.save(as_text=False)
            if verbose:
                print("  SavedModel graph written successfully. " )
            success = True
        except Exception as e:
            print("       WARNING::SavedModel write FAILED. " )
            traceback.print_tb(e.__traceback__)
            success = False
        return success

1 Ответ

2 голосов
/ 08 мая 2019

@ Гефест,

Если вы создаете SavedModelBuilder каждый раз, тогда он будет добавлять новые операции сохранения к графику каждый раз, когда вы save.

Вместо этого вы можете создать SavedModelBuilder только один раз и просто вызывать builder.save несколько раз.Это не добавит новые операции на график при каждом save вызове.

В качестве альтернативы я думаю, что вы можете создать свой собственный tf.train.Saver и передать его на add_meta_graph_and_variables.Тогда он не должен создавать никаких новых операций.

Хорошая помощь при отладке - tf.get_default_graph().finalize(), как только вы закончите построение графика, это вызовет исключение, а не расширение графа, как это.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...