Как загрузить TensorRT SavedModel в оценщик TensorFlow?

Я использую TensorFlow 1.14, и для загрузки TensorFlow SavedModel в оценщик у меня работает следующий код:

estimator = tf.contrib.estimator.SavedModelEstimator(saved_model_dir)
prediction_results = estimator.predict(input_fn)

Однако, когда я использовал TensorRT для преобразования SavedModel TensorFlow в SavedModel TensorRT, он возвращает сообщение об ошибке:

ValueError: Directory provided has an invalid SavedModel format: saved_models/nvidia_fp16_converted

Я рассмотрел это дальше, и похоже, что проблема в том, что TensorRT не генерирует никакой информации о переменных (включая variables.index) в каталоге SavedModel, что вызывает указанную выше ошибку. Кто-нибудь знает, как решить эту проблему?


person Minh Nguyen    schedule 17.09.2020    source источник
comment
Зачем вам использовать оценщик TF для вывода движка TensorRT?   -  person mibrahimy    schedule 20.09.2020
comment
Это было требованием для решения, которое я должен разработать, поскольку другие части решения уже используют оценщик TF.   -  person Minh Nguyen    schedule 20.09.2020


Ответы (1)


Для всех, кому интересно, ниже представлено решение, которое я придумал сам: Обычно TF SavedModel можно загрузить в Оценщик, используя:

estimator = tf.contrib.estimator.SavedModelEstimator(SAVED_MODEL_DIR)

Однако при загрузке TensorRT SavedModel возникают ошибки, потому что TensorRT преобразует все переменные в константы, поэтому в каталоге SavedModel нет информации о переменных (например, нет переменных.index) → возникают ошибки, поскольку оценщик пытается загрузить переменные. Шаги по устранению проблемы:

  • Нам нужно перейти в файл: "/usr/local/lib/python3.6/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 2330, in _get_saved_model_ckpt и закомментировать проверку переменных.index
"""if not gfile.Exists(os.path.join(saved_model_utils.get_variables_dir(saved_model_dir),
compat.as_text('variables.index'))):
raise ValueError('Directory provided has an invalid SavedModel format: %s'
% saved_model_dir)"""
  • Перейдите в файл: "/usr/local/lib/python3.6/dist-packages/tensorflow_estimator/python/estimator/canned/saved_model_estimator.py", line 145, in __init__checkpoint_utils.list_variables(checkpoint)] и внесите изменения, чтобы оценщик не пытался загрузить переменные из SavedModel:
"""checkpoint = estimator_lib._get_saved_model_ckpt(saved_model_dir) # pylint: disable=protected-access
vars_to_warm_start = [name for name, _ in
checkpoint_utils.list_variables(checkpoint)]
warm_start_settings = estimator_lib.WarmStartSettings(
ckpt_to_initialize_from=checkpoint,
vars_to_warm_start=vars_to_warm_start)"""
warm_start_settings = estimator_lib.WarmStartSettings(ckpt_to_initialize_from = estimator_lib._get_saved_model_ckpt(saved_model_dir))
  • Перейдите в файл: "/usr/local/lib/python3.6/dist-packages/tensorflow_estimator/python/estimator/canned/saved_model_estimator.py", line 256, in _model_fn_from_saved_modeltraining_util.assert_global_step(global_step_tensor) и закомментируйте проверку global_step в случае, если модель сгенерирована из примеров NVIDIA (таким образом, обучение не проводилось и global_step не был установлен):
#global_step_tensor = training_util.get_global_step(g)
#training_util.assert_global_step(global_step_tensor)
  • Перейдите в файл: "/usr/local/lib/python3.6/dist-packages/tensorflow/python/training/checkpoint_utils.py", line 291, in init_from_checkpoint init_from_checkpoint_fn) и просто поместите return в начало функции init_from_checkpoint, чтобы она не пыталась загрузить контрольную точку:
def _init_from_checkpoint(ckpt_dir_or_file, assignment_map):
"""See `init_from_checkpoint` for documentation."""
return

После всех вышеперечисленных изменений процесс загрузки должен пройти нормально.

person Minh Nguyen    schedule 17.09.2020