Почему Tensorflow Serving запускает модель медленнее, чем Tensorflow на стандартной модели Keras? - PullRequest
1 голос
/ 02 марта 2020

Я пытался развернуть решение для машинного обучения с Tensorflow Serving на встроенном устройстве (Jetson Xavier [ARMv8]) *

Одной из моделей, используемых решением, является стандартная сеть Xception, созданная с помощью:

xception = tf.keras.applications.Xception(include_top=False, input_shape=(299, 299, 3), pooling=None
xception.save("./saved_xception_model/1", save_format="tf")

Запуск модели Xception на устройстве создает разумную производительность - около 0,1 с для прогнозирования, игнорируя все процессы:

xception = tf.keras.models.load_model("saved_xception_model/1", save_format="tf")
image = get_some_image() # image is numpy.ndarray
image.astype("float32")
image /= 255
image = cv2.resize(image, (299, 299))
# Tensorflow predict takes ~0.1s
xception.predict([image])

Однако, как только модель запускается в графическом процессоре Tensorflow Serving GPU Контейнер, через Nvidia- Docker, модель намного медленнее - около 3 с, чтобы предсказать.

Я пытался выделить причину плохой производительности, и у меня закончились идеи.

До сих пор я тестировал:

  1. Настройка параметров пакетной обработки TF Serving до go с задержкой (batch_timeout_micros: 0, max_batch_size: 1, и заметил небольшое усиление 0,5 с в исполнении.
  2. Оптимизация модели с помощью TensorRT с помощью saved_model_cli.
  3. Запуск модели Xception изолированно, как единственной модели, обслуживаемой службой TF.
  4. Эксперимент с удвоением памяти, выделенной для процесса TF.
  5. Эксперимент с включением и отключением пакетной обработки в целом.
  6. Эксперимент с включением и отключением прогрева модели.

Я ожидал бы TF Служит для обеспечения того же (более или менее, допускающего кодирование и декодирование GRP C) времени предсказания, что и для TF, и они подходят для других моделей, которые я использую. Ни одно из моих усилий не дало Xception такую ​​высокую производительность, как я ожидал.

Моя установка Tensorflow собрана Nvidia из TF версии 2.0. Мой контейнер TF Serving создается из источника TF-Serving 2.0 с поддержкой графического процессора.

Я запускаю контейнер Tensorflow Serving следующим образом:

tf_serving_cmd = "docker run --runtime=nvidia -d"
tf_serving_cmd += " --name my-container"
tf_serving_cmd += " -p=8500:8500 -p=8501:8501"
tf_serving_cmd += " --mount=type=bind,source=/home/xception_model,target=/models/xception_model"
tf_serving_cmd += " --mount=type=bind,source=/home/model_config.pb,target=/models/model_config.pb"
tf_serving_cmd += " --mount=type=bind,source=/home/batching_config.pb,target=/models/batching_config.pb"

# Self built TF serving image for Jetson Xavier, ARMv8.
tf_serving_cmd += " ${MY_ORG}/serving" 
# I have tried 0.5 with no performance difference. 

# TF-Serving does not complain it wants more memory in either case.
tf_serving_cmd += " --per_process_gpu_memory_fraction:0.25"
tf_serving_cmd += " --model_config_file=/models/model_config.pb"
tf_serving_cmd += " --flush_filesystem_caches=true"
tf_serving_cmd += " --enable_model_warmup=true"
tf_serving_cmd += " --enable_batching=true"
tf_serving_cmd += " --batching_parameters_file=/models/batching_config.pb"

Я нахожусь в точке где я начинаю задаваться вопросом, является ли это ошибкой в ​​TF-Serving, хотя я понятия не имею, где (Да, я знаю, что это никогда не ошибка, это всегда пользователь ...)

Может кто-нибудь предложить почему TF-Обслуживание может быть ниже по сравнению с TF?

...