CLI для проверки и выполнения SavedModel
Вы можете использовать интерфейс командной строки SavedModel (CLI) для проверки и выполнения SavedModel. Например, вы можете использовать CLI для проверки SignatureDef
модели. CLI позволяет быстро подтвердить, что ввод соотвествует Tensor dtype и форма соответствует требуемой в модели. Более того, если вы хотите протестировать свою модель, вы можете использовать CLI для проверки работоспособности: передавать входные данные в различных форматах (например, Python выражения), а затем извлекать вывод.
Установка интерфейса командной строки (CLI) для SavedModel
Вы можете установить сам TensorFlow одним из следующих способов:
- Устанавливая предварительно собранный бинарный файл TensorFlow.
- Путем сборки TensorFlow из исходного кода.
Если вы установили TensorFlow через предварительно созданный бинарный файл TensorFlow, тогда CLI SavedModel уже установлен в вашей системе по пути bin\save_model_cli
.
Если вы собрали TensorFlow из исходного кода, вы должны выполнить следующую дополнительную команду для сборки save_model_cli
:
$ bazel build tensorflow/python/tools:saved_model_cli
Обзор команд
CLI SavedModel поддерживает следующие две команды на MetaGraphDef
в SavedModel:
show
, который показывает вычисление дляMetaGraphDef
в SavedModel.run
, который выполняет вычисления дляMetaGraphDef
.
show
команда
SavedModel содержит один или несколько MetaGraphDef
, идентифицированных по их наборам тегов. Перед началом обслуживания модели, у вас может возникнуть вопрос, какие SignatureDef
есть в каждой модели и каковы их вводы и выводы. Команда show
позволяет вам изучить содержимое SavedModel в иерархическом порядке. Вот синтаксис:
usage: saved_model_cli show [-h] --dir DIR [--all]
[--tag_set TAG_SET] [--signature_def SIGNATURE_DEF_KEY]
Например, следующая команда показывает все доступные наборы тегов MetaGraphDef в SavedModel:
$ saved_model_cli show --dir /tmp/saved_model_dir
The given SavedModel contains the following tag-sets:
serve
serve, gpu
Следующая команда показывает все доступные ключи SignatureDef
в MetaGraphDef
:
$ saved_model_cli show --dir /tmp/saved_model_dir --tag_set serve
The given SavedModel MetaGraphDef contains SignatureDefs with the
following keys:
SignatureDef key: "classify_x2_to_y3"
SignatureDef key: "classify_x_to_y"
SignatureDef key: "regress_x2_to_y3"
SignatureDef key: "regress_x_to_y"
SignatureDef key: "regress_x_to_y2"
SignatureDef key: "serving_default"
Если MetaGraphDef
имеет несколько тегов в наборе тегов, необходимо указать все теги, где каждый тег разделен запятой. Например:
$ saved_model_cli show --dir /tmp/saved_model_dir --tag_set serve,gpu
Чтобы показать все вводы и выводы TensorInfo для определенного SignatureDef
, введите ключ SignatureDef
для параметра signature_def
. Это очень полезно, когда вы хотите узнать значение ключа тензора, dtype и форму вводных тензоров для выполнение графа вычислений позже. Например:
$ saved_model_cli show --dir \
/tmp/saved_model_dir --tag_set serve --signature_def serving_default
The given SavedModel SignatureDef contains the following input(s):
inputs['x'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: x:0
The given SavedModel SignatureDef contains the following output(s):
outputs['y'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: y:0
Method name is: tensorflow/serving/predict
Для того чтобы показать всю доступную информацию в SavedModel, используйте --all
опцию. Например:
$ saved_model_cli show --dir /tmp/saved_model_dir --all
MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:
signature_def['classify_x2_to_y3']:
The given SavedModel SignatureDef contains the following input(s):
inputs['inputs'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: x2:0
The given SavedModel SignatureDef contains the following output(s):
outputs['scores'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: y3:0
Method name is: tensorflow/serving/classify
...
signature_def['serving_default']:
The given SavedModel SignatureDef contains the following input(s):
inputs['x'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: x:0
The given SavedModel SignatureDef contains the following output(s):
outputs['y'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: y:0
Method name is: tensorflow/serving/predict
run
команда
Вызовите команду run
для запуска вычисления графа, передав вводы и затем отображая (и, опционально, сохраняя) выводы. Вот синтаксис:
usage: saved_model_cli run [-h] --dir DIR --tag_set TAG_SET
--signature_def SIGNATURE_DEF_KEY
[--inputs INPUTS]
[--input_exprs INPUT_EXPRS]
[--input_examples INPUT_EXAMPLES]
[--outdir OUTDIR]
[--overwrite] [--tf_debug]
Команда run
предоставляет следующие три способа передачи вводных данных в модель:
--inputs
опция позволяет вам передавать numpy ndarray в файлах.--input_exprs
опция позволяет передавать Python выражения.--input_examples
опция позволяет передатьtf.train.Example
.
--inputs
Чтобы передать вводные данные в файлах, укажите параметр --inputs
, который принимает следующий общий формат:
--inputs <INPUTS>
где <INPUTS> имеет один из следующих форматов:
<input_key>=<filename>
<input_key>=<filename>[<variable_name>]
Вы можете передать несколько INPUTS. Если вы передаете несколько вводов, используйте точку с запятой, чтобы отделить каждый из INPUTS.
saved_model_cli
использует numpy.load
для загрузки filename. filename может иметь любой из следующих форматов:
.npy
.npz
- pickle формат
Файл .npy
всегда содержит numpy ndarray. Поэтому при загрузке из файла .npy
, контент будет напрямую назначен на указанный вводный тензор. Если вы укажете variable_name с этим файлом .npy
, variable_name будет проигнорировано, и будет выдано предупреждение.
При загрузке из файла .npz
(zip) вы можете при желании указать variable_name, чтобы определить переменную в zip-файле для загрузки ключа вводного тензора. Если вы не укажете variable_name, SavedModel CLI проверит, что в zip-файл включен только один файл, и загрузит его для указанного ключа вводного тензора.
При загрузке из pickle файла, если variable_name
не указано в квадратных скобках, все, что находится внутри pickle файла, будет передано в указанный ключ тензора ввода. В противном случае SavedModel CLI примет словарь хранимый в pickle файле и значение, соответствующее variable_name будет использовано.
--input_exprs
Чтобы передать вводные данные через Python выражения, укажите параметр --input_exprs
. Это может быть полезно, когда у вас нет файлов данных, лежащих поблизости, но вы хотите проверить модель с некоторыми простыми вводными данными, которые соответствуют dtype и форме SignatureDef
модели. Например:
<input_key>=[[1],[2],[3]]
В дополнение к Python выражениям вы также можете передавать numpy функции. Например:р>
<input_key>=np.ones((32,32,3))
(обратите внимание, что модуль numpy
уже доступен как np
.)
--input_examples
Для передачи tf.train.Example
в качестве вводных данных, укажите параметр --input_examples
. Для каждого ключа ввода, он принимает список словарей, где каждый словарь является экземпляром tf.train.Example
. Ключи словаря являются свойствами, а значения - это списки значений для каждого свойства. Например:
<input_key>=[{"age":[22,24],"education":["BS","MS"]}]
Сохранение вывода
По умолчанию SavedModel CLI записывает вывод в стандартный вывод. Если каталог передан параметру --outdir
, выходные данные будут сохранены в виде файлов npy с именами ключей выходных тензоров из заданного каталога.
Используйте --overwrite
, чтобы перезаписать существующие выходные файлы.
Интеграция отладчика TensorFlow (tfdbg)
Если установлена опция --tf_debug
, SavedModel CLI будет использовать TensorFlow Debugger (tfdbg) для просмотра промежуточных тензоров и времени выполнения графов или подграфов во время работы SavedModel.
Полные примеры run
Дано:
- Ваша модель просто добавляет
x1
иx2
, чтобы получить выходные данныеy
. - Все тензоры в модели имеют форму
(-1, 1)
. - У вас есть два файла
npy
:/tmp/my_data1.npy
, который содержит numpy ndarray[[1], [2], [3]]
./tmp/my_data2.npy
, который содержит другой numpy ndarray[[0.5], [0.5], [0.5]]
.
Чтобы запустить эти два npy
файла через модель для получения вывода y
, выполните следующую команду:
$ saved_model_cli run --dir /tmp/saved_model_dir --tag_set serve \
--signature_def x1_x2_to_y \
--inputs 'x1=/tmp/my_data1.npy;x2=/tmp/my_data2.npy' \
--outdir /tmp/out
Result for output key y:
[[ 1.5]
[ 2.5]
[ 3.5]]
Давайте немного поменяем предыдущий пример. В этот раз вместо двух .npy файлов у вас есть .npz файл и pickle файл. Кроме того, вы хотите перезаписать любой существующий файл вывода. Вот команда:
$ saved_model_cli run --dir /tmp/saved_model_dir --tag_set serve \
--signature_def x1_x2_to_y \
--inputs 'x1=/tmp/my_data1.npz[x];x2=/tmp/my_data2.pkl' \
--outdir /tmp/out \
--overwrite
Result for output key y:
[[ 1.5]
[ 2.5]
[ 3.5]]
Вы можете задать python выражение вместо файла ввода. Например, следующая команда заменяет ввод x2 Python выражением:
$ saved_model_cli run --dir /tmp/saved_model_dir --tag_set serve \
--signature_def x1_x2_to_y --inputs x1=/tmp/my_data1.npz[x] \
--input_exprs 'x2=np.ones((3,1))'
Result for output key y:
[[ 2]
[ 3]
[ 4]]
Для того чтобы выполнить модель с включенным TensorFlow Debugger используйте следующую команду:
$ saved_model_cli run --dir /tmp/saved_model_dir --tag_set serve \
--signature_def serving_default --inputs x=/tmp/data.npz[x] --tf_debug
Читайте также другие статьи по этой теме в блоге: