Я пытался развернуть решение для машинного обучения с 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 с, чтобы предсказать.
Я пытался выделить причину плохой производительности, и у меня закончились идеи.
До сих пор я тестировал:
- Настройка параметров пакетной обработки TF Serving до go с задержкой (
batch_timeout_micros: 0
, max_batch_size: 1
, и заметил небольшое усиление 0,5 с в исполнении. - Оптимизация модели с помощью TensorRT с помощью
saved_model_cli
. - Запуск модели Xception изолированно, как единственной модели, обслуживаемой службой TF.
- Эксперимент с удвоением памяти, выделенной для процесса TF.
- Эксперимент с включением и отключением пакетной обработки в целом.
- Эксперимент с включением и отключением прогрева модели.
Я ожидал бы 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?