Как оптимизировать модель Tensorflow для обслуживания

Я обучил модель с Керасом. Теперь я хочу развернуть его через службу Tensorflow. Поэтому я преобразовал его в формат SavedModel таким образом:

K.set_learning_phase(0)
    K._LEARNING_PHASE = tf.constant(0)
    # sess = K.get_session()
    if not os.path.exists(path):
        os.mkdir(path)
    export_path = os.path.join(
        tf.compat.as_bytes(path),
        tf.compat.as_bytes(str(get_new_version(path=path, current_version=int(version)))))
    print('Learning phase', K.learning_phase())
    print('Exporting trained model to', export_path)
    builder = tf.saved_model.builder.SavedModelBuilder(export_path)

    model_input = tf.saved_model.utils.build_tensor_info(model.input)
    model_output = tf.saved_model.utils.build_tensor_info(model.output)

    prediction_signature = (
        tf.saved_model.signature_def_utils.build_signature_def(
            inputs={'inputs': model_input},
            outputs={'output': model_output},
            method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))

    with K.get_session() as sess:

        builder.add_meta_graph_and_variables(
            sess=sess, tags=[tf.saved_model.tag_constants.SERVING],
            signature_def_map={
                'predict':
                    prediction_signature,
            })

        builder.save()

Я начал использовать службу Tensorflow (установил Tensorflow-model-server через apt-get install). Но моя модель имеет размер 376 МБ (как Saved_model.pb, так и папка переменных), а время прогнозирования очень велико (около 0,3 секунды на запрос), а при увеличении rps задержка уменьшается.

Итак, я хочу оптимизировать свою модель, знает ли кто-нибудь какие-нибудь приемы, как это сделать?

P.S. Моя модель в Керасе сохраняется с save_model(model).


person streamride    schedule 27.09.2017    source источник


Ответы (1)


Некоторые мысли:

  1. Убедитесь, что вы не оставили никаких очередей (например, FIFOQueue) в своей модели обслуживания. Они часто используются при обучении, чтобы скрыть задержки ввода-вывода, но могут снизить производительность обслуживания.

  2. Рассмотрите возможность пакетирования нескольких запросов на вывод вместе в один вызов модели / графа TF. См. --Enable_batching, с настройкой через --batching_parameters_file.

  3. Помимо этих советов, вам нужно будет изучить структуру самой модели. Возможно, у других есть идеи по этому поводу.

-Крис (команда обслуживания TF)

person Christopher Olston    schedule 27.09.2017
comment
Спасибо за ответ, Крис, не могли бы вы рассказать о FIFIQueue в модели? - person streamride; 28.09.2017
comment
И я прав, что при сохранении модели график зависает? - person streamride; 28.09.2017