"Введение«После завершения обучения модели нам нужно использовать сохраненную модель для онлайн-прогнозирования, то есть сервис Model Serving. Команда TensorFlow предоставляет TensorFlow Serving, сервисную систему, специально используемую для прогнозирования моделей. Она разработана для производственных сред, отличается высокой производительностью и большой гибкостью. представлен подробно.
Сервисное строительство
Официально рекомендуетсяDocker
Что нужно сделатьTensorFlow Serving
Это самый простой и прямой способ создания службы. Для удобства работы в этой статье также принят этот метод построения.
строительствоServing
При подаче сначала убедитесь, что система установленаDocker
программе, затем по командеdocker pull tensorflow/serving:version
чтобы получить указанную версиюTensorFlow Serving
образ, который затем можно использовать для загрузкиServing
услуга.
должен быть в курсеTensorFlow Serving
Версия сервиса лучше всего подходит для обученияTensorFlow
Версии поддерживаются согласованными, чтобы уменьшить ненужные проблемы совместимости. Доступна сdockerhub
Веб-сайт запрашивает все доступные версии зеркала, такие как стабильная версия (latest
), указав версию (2.2.0
) или ежедневно обновляемую версию (nightly
) Ждать.
Если вы хотите использоватьGPU
Для поддержки службы прогнозирования модели необходимо получитьTensorFlow Serving
отражать соответствующиеGPU
Версия (docker pull tensorflow/serving:version-gpu
) и настроить локальныйGPU
окрестности.
Обслуживание одной модели
Когда мы закончили обучение и сохранили модель, мы можем легко запустить модельServing
сервис для тестирования и проверки.
спасет первымSavedModel
Файлы модели формата размещаются локально/path/to/tfs/models/model/version
каталог, структура каталога следующая:
model/
└── 0
├── assets
├── saved_model.pb
└── variables
├── variables.data-00000-of-00001
└── variables.index
вmodel
Указывает имя загружаемой модели,0
Указывает доступные версии модели, здесь только одна версия, а версий может быть несколько. Файлы в каталоге версииSavedModel
файл форматирования, в模型保存
Содержимое, хранящееся в этих файлах, было представлено в этой статье и не будет здесь повторяться.
Затем используйте следующую команду, чтобы запуститьServing
Служить:
docker run -d -p 8501:8501 \
-v /path/to/tfs/models/model:/models/model \
tensorflow/serving:2.2.0
ДолженServing
В сервисе загружена только одна модель, модель называетсяmodel
, номер версии0
. несущийServing
Контейнер службы открыт8501
порт для приемаHTTP
Запрос доступа к интерфейсу.
Мы можем установить переменные среды внутри контейнера при запуске контейнера.MODEL_BASE_PATH
Чтобы указать путь хранения модели, значением по умолчанию для этой переменной среды является/models
, указывая, что изнутри контейнера/models
Путь для загрузки модели. Аналогично, поMODEL_NAME
переменная среды, чтобы указать имя загружаемой модели, значение по умолчанию для этой переменной среды:model
. на основе переменных окруженияServing
Команда запуска службы выглядит так:
docker run -d -p 8501:8501 \
-v /path/to/tfs/models/model:/models/model \
-e MODEL_BASE_PATH=/models \
-e MODEL_NAME=model \
tensorflow/serving:2.2.0
В дополнение к установке переменных среды внутри контейнера мы также можем использоватьServing
Параметры запуска службы--model_base_path
и--model_name
чтобы указать путь хранения и имя модели модели соответственно. Команда запуска выглядит так:
docker run -d -p 8501:8501 \
-v /path/to/tfs/models/model:/models/model \
tensorflow/serving:2.2.0 \
--model_base_path=/models \
--model_name=model
существуетServing
После того, как служба успешно запущена, к ней можно получить доступ, обратившись к определенномуHTTP
Интерфейс для проверки успешности загрузки модели. Пример его запроса и ответа показан ниже:
$ curl http://localhost:8501/v1/models/model
{
"model_version_status": [
{
"version": "0",
"state": "AVAILABLE",
"status": {
"error_code": "OK",
"error_message": ""
}
}
]
}
Когда состояние моделиAVAILABLE
указывает, что соответствующая версия модели была успешно загружена и готова к работеServing
услуга. Если вызов этого интерфейса возвращает ошибку или не возвращает, это означает, что есть проблема с загрузкой модели.В это время вы можете использовать возвращенную информацию об ошибке или использоватьdocker logs containerid
Проверьте журналы контейнера, чтобы найти проблему.
Следует отметить, что если путь хранения модели содержит несколько версий модели,Serving
Служба загрузит модель, соответствующую наибольшему номеру версии по умолчанию, то есть модель может быть предоставлена только в одной версии за раз.Serving
Служить.
Мультимодельная служба обслуживания
В общем, онлайнServing
Несколько моделей или несколько версий моделей развернуты в службе одновременно дляA/B Test
Протестируйте использование, а затем оцените фактический эффект работы разных моделей. В то время как единая модель, представленная в предыдущем разделеServing
Сервис не может выполнить это требование, так как его имя модели и загруженная версия модели фиксированы, в этом случае вы можете использовать файл конфигурации (models.config
) изServing
услуги для достижения вышеуказанных целей.
Содержимое файла конфигурации модели основано наModelServerConfigсгенерированная структура,ModelServerConfigдаmodel_server_config.proto
Структура данных, определенная в файле (message
), конкретную информацию об определении можно найти в его исходном коде. файла конфигурации基础
Пример показан ниже:
model_config_list {
config {
name: 'first_model'
base_path: '/models/first_model'
model_platform: 'tensorflow'
}
config {
name: 'second_model'
base_path: '/models/second_model'
model_platform: 'tensorflow'
}
}
каждый из файлов конфигурацииconfig
оба соответствуют загружаемой модели, гдеbase_path
соответствует пути нагрузки для этой модели,name
Соответствует названию модели, если по этому пути существует несколько версий файла модели, тоTensorFlow Serving
по-прежнему будет выбирать модель с наибольшим номером версии для предоставленияServing
Служить.
Поместите указанный выше файл конфигурации в/path/to/tfs/config
каталог и используйте следующую команду, чтобы запустить мультимодельныйTensorFlow Serving
Служить:
docker run -d -p 8501:8501 \
-v /path/to/tfs/models:/models \
-v /path/to/tfs/config:/config \
tensorflow/serving:2.2.0 \
--model_config_file=/config/models.config
Таким же образомServing
После запуска сервиса его можно использоватьHTTP
Интерфейс для просмотра информации о загрузке каждой модели:
$ curl http://localhost:8501/v1/models/first_model
$ curl http://localhost:8501/v1/models/second_model
{
"model_version_status": [
{
"version": "0",
"state": "AVAILABLE",
"status": {
"error_code": "OK",
"error_message": ""
}
}
]
}
На данный момент мы можем использовать несколько моделей для одновременной работы онлайн.Serving
услуга.
Конфигурация службы обслуживания
Конфигурация модели
models.config
В дополнение к указанию имени и пути загрузки нескольких моделей файл конфигурации также может указывать стратегию версии модели (version policy
), теги версии (labels
) и запись журнала запросов (logging
) метод и т. д., предоставляет нам большое удобство.
По тому же пути модели,Serving
Сервис загрузит модель с наибольшим номером версии по умолчанию, а изменив файл конфигурацииmodel_version_policy
В элементе конфигурации мы можем указать версию модели для загрузки. Если мы хотим использовать номер версии какN
Модель обеспечиваетServing
сервис, первыйmodel_version_policy
Политика настроена наspecific
, затем вspecific
Укажите соответствующий номер версии вN
Вот и все. Конфигурация модели с указанием номера версии выглядит следующим образом:
config {
name: 'first_model'
base_path: '/models/first_model'
model_platform: 'tensorflow'
model_version_policy {
specific {
versions: 0
}
}
}
Этот вариант конфигурации доступен в последней версии модели.Serving
Полезно, когда возникает проблема и требуется откат к заведомо лучшей версии.
Если вам нужно использовать несколько версий модели одновременно, чтобы обеспечитьServing
Служба также настраивается таким же образом, но ее нужно установить вspecific
Несколько номеров версий указаны в файлах . Конфигурация модели выглядит так:
config {
name: 'first_model'
base_path: '/models/first_model'
model_platform: 'tensorflow'
model_version_policy {
specific {
versions: 0
versions: 1
}
}
}
Иногда полезно указать псевдоним или метку для номера версии модели, чтобы клиенту не нужно было знать конкретный номер версии при вызове, и он мог напрямую обращаться к соответствующей метке. Например, мы можем установить стабильную версию (stable
), он может указывать на любой номер версии модели, клиенту просто нужно получить доступstable
Теги, чтобы получать последниеServing
Служить. Если есть новая стабильная версия, вам нужно только изменитьstable
Номер версии, на который указывает тег, и клиент не знает об этом изменении, поэтому никаких изменений не требуется. Обратите внимание, что только поgRPC
Функцию метки можно использовать только при доступе к интерфейсу.HTTP
Интерфейсы не поддерживаются.
Конфигурация модели с метками выглядит так:
config {
name: 'first_model'
base_path: '/models/first_model'
model_platform: 'tensorflow'
model_version_policy {
specific {
versions: 0
versions: 1
}
}
version_labels {
key: 'stable'
value: 1
}
version_labels {
key: 'canary'
value: 0
}
}
Если модель нужно откатить, нужно только изменить номер версии, соответствующий соответствующему тегу в конфигурационном файле.
Обратите внимание, что загружена только версия модели, и статус этой версии моделиAVAILABLE
, этой версии модели можно присвоить метку. Если вам нужно указать метку для версии модели, которая не была загружена (например, вServing
При запуске в конфигурационном файле указана как версия модели, так и тег), необходимо добавить--allow_version_labels_for_unavailable_models
Параметры запуска установлены наtrue
.
Однако приведенные выше параметры запуска применимы только к указанию номеров версий для новых этикеток. Если вы хотите переназначить версию уже используемой метке, вы должны назначить ее загруженной версии модели, что позволяет избежать сбоев в сети из-за недопустимых запросов, отправленных на эту метку во время переключения версии. Поэтому, если вы хотите пометитьstable
из версииN
переназначить на версиюN + 1
, вы должны сначала зафиксировать оба, содержащие версиюN
и версияN + 1
конфигурация, ожидающая версияN + 1
После успешной загрузки отправьте меткуstable
указать версиюN + 1
конфигурации для завершения операции обновления метки.
Конфигурация мониторинга
онлайнServing
, нам нужно понятьServing
Различные индикаторы сервиса, чтобы мы могли вовремя находить проблемы и вносить коррективы.
мы можем использовать--monitoring_config_file
параметр для включенияServing
Функция получения индикатора мониторинга обслуживания. Этот параметр требует указания конфигурационного файла, содержимое которого соответствуетmonitoring_config.proto
определено в файлеMonitoringConfigструктура данных (message
), конкретное определение можно найти в исходном коде. Содержимое конфигурационного файла следующее:
prometheus_config {
enable: true,
path: "/metrics"
}
вenable
Указывает, следует ли включить мониторинг,path
Указывает на получение индикаторов мониторингаuri
. Сохраните приведенную выше конфигурацию вmonitor.config
файл и поместите файл в/path/to/tfs/config
каталог, а затем используйте следующую команду, чтобы запустить индикатор мониторингаServing
Служить:
docker run -d -p 8501:8501 \
-v /path/to/tfs/models:/models \
-v /path/to/tfs/config:/config \
tensorflow/serving:2.2.0 \
--model_config_file=/config/models.config \
--monitoring_config_file=/config/monitor.config
доступhttp://localhost:8501/metrics
видетьTensorFlow Serving
Информация об индикаторе мониторинга в режиме реального времени службы. Ниже приведены некоторые индикаторы мониторинга:
# TYPE :tensorflow:api:op:using_fake_quantization gauge
# TYPE :tensorflow:cc:saved_model:load_attempt_count counter
:tensorflow:cc:saved_model:load_attempt_count{model_path="/models/first_model/0",status="success"} 1
:tensorflow:cc:saved_model:load_attempt_count{model_path="/models/first_model/1",status="success"} 1
:tensorflow:cc:saved_model:load_attempt_count{model_path="/models/second_model/1",status="success"} 1
# TYPE :tensorflow:cc:saved_model:load_latency counter
:tensorflow:cc:saved_model:load_latency{model_path="/models/first_model/0"} 61678
:tensorflow:cc:saved_model:load_latency{model_path="/models/first_model/1"} 59848
:tensorflow:cc:saved_model:load_latency{model_path="/models/second_model/1"} 95868
# TYPE :tensorflow:cc:saved_model:load_latency_by_stage histogram
:tensorflow:cc:saved_model:load_latency_by_stage_bucket{model_path="/models/first_model/0",stage="init_graph",le="10"} 0
Чтобы отслеживать эти показатели более интуитивно, все показатели могут быть собраныPrometheus
и использоватьGrafana
Сделайте визуальную презентацию. Результаты визуализации некоторых индикаторов представлены на следующем рисунке:
пакетная конфигурация
Serving
Службы могут группировать клиентские запросы для повышения пропускной способности. заServing
Все модели и версии моделей, загруженные службой, пакетные операции будут единообразно планироваться в глобальном масштабе, чтобы обеспечить максимальное использование основных вычислительных ресурсов. можно использовать--enable_batching
параметр, чтобы включить пакетные операции, и использовать--batching_parameters_file
Спецификация параметров запуска批处理参数配置文件 (batching.config)
для настройки параметров, связанных с пакетной обработкой.
Содержимое файла конфигурации пакетных параметров следующее:
max_batch_size { value: 128 }
batch_timeout_micros { value: 0 }
num_batch_threads { value: 8 }
max_enqueued_batches { value: 8 }
вmax_batch_size
Параметр используется для управления компромиссом между пропускной способностью и задержкой, а также предотвращаетbatch
Слишком большой превышает лимит ресурсов, и запрос завершается ошибкой.batch_timeout_micros
Параметр указывает максимальное время ожидания перед выполнением пакетной операции (даже если оно еще не достигнуто).max_batch_size
также будет выполняться), в основном используется для управления задержкой хвоста.num_batch_threads
Указывает максимальное количество пакетных операций для параллельного выполнения.max_enqueued_batches
Указывает количество пакетных задач, которые могут попасть в очередь планировщика, чтобы ограничить задержку, вызванную очередями.
будетbatching.config
файл и помещается в/path/to/tfs/config
каталог, а затем используйте следующую команду, чтобы запустить пакетную операцию сServing
Служить:
docker run -d -p 8501:8501 \
-v /path/to/tfs/models:/models \
-v /path/to/tfs/config:/config \
tensorflow/serving:2.2.0 \
--model_config_file=/config/models.config \
--enable_batching=true \
--batching_parameters_file=/config/batching.config
Обратите внимание на регулировкуmax_batch_size
иmax_enqueued_batches
Когда параметр установлен, его не следует устанавливать слишком большим, чтобы избежать переполнения памяти из-за большого использования памяти, что влияет на оперативную работу.Serving
Служить.
Параметры запуска службы
В дополнение к некоторым из вышеперечисленныхServing
Помимо параметров запуска службы, необходимо понимать и другие параметры запуска.Serving
Сервис тонко настроен для достижения нужного эффекта. Ниже приводится краткое введение в некоторые из наиболее важных параметров запуска:
-
--port
:gRPC
Порт прослушивания службы, по умолчанию8500
порт. -
--rest_api_port
:HTTP
Порт прослушивания службы, по умолчанию8501
порт. -
--rest_api_timeout_in_ms
:HTTP
Ограничение времени ожидания запроса (миллисекунды), по умолчанию30000
миллисекунда. -
--model_config_file
: путь к файлу конфигурации модели. -
--model_config_file_poll_wait_seconds
: интервал (в секундах) для периодической загрузки файла конфигурации модели, по умолчанию0
,ВыражатьServing
После запуска службы она больше не загружается периодически. -
--file_system_poll_wait_seconds
: интервал (в секундах) для периодической загрузки новых версий модели, по умолчанию1
второй. -
--enable_batching
:bool
, следует ли включить пакетную операцию запроса, по умолчаниюfalse
. -
--batching_parameters_file
: Путь к файлу конфигурации параметров для пакетных операций. -
--monitoring_config_file
: путь к файлу конфигурации для мониторинга. -
--allow_version_labels_for_unavailable_models
:bool
, можно ли назначать метки еще не загруженным моделям, по умолчаниюfalse
. -
--model_name
: название модели, в одиночной моделиServing
при использовании. -
--model_base_path
: путь загрузки модели, в одиночной моделиServing
при использовании. -
--enable_model_warmup
:bool
, использовать ли данные для прогрева модели, чтобы уменьшить задержку ответа на первый запрос, по умолчаниюfalse
. так какTensorFlow
В среде выполнения есть компоненты, которые инициализируются лениво, что может привести к длительному времени ответа на первый запрос, отправленный к модели после загрузки модели, и эта задержка может быть на несколько порядков выше, чем время, необходимое для одного запроса. Чтобы уменьшить влияние ленивой инициализации на ответ на запрос, можно предоставить набор образцов запроса для запуска инициализации компонента при загрузке модели.Этот процесс называется模型预热
. - Дополнительные параметры запуска можно найти в исходном коде.
Полный пример
Полностью настроенная мультимодельServing
Служба запускается следующим образом:
docker run -d -p 8500:8500 -p 8501:8501 \
-v /path/to/tfs/models:/models \
-v /path/to/tfs/config:/config \
tensorflow/serving:2.2.0 \
--model_config_file=/config/models.config \
--monitoring_config_file=/config/monitor.config \
--enable_batching=true \
--batching_parameters_file=/config/batching.config \
--model_config_file_poll_wait_seconds=10 \
--file_system_poll_wait_seconds=10 \
--allow_version_labels_for_unavailable_models=true
Доступ к HTTP-интерфейсу
мы можем получить доступServing
УслугиHTTP
Интерфейс для запроса информации о модели, включая статус загрузки модели, метаданные модели и результаты прогнозирования модели.
Все запросы и ответыBody
обаjson
отформатировано, для плохих запросов,Serving
Служба возвращает сообщение об ошибке в следующем формате:
{
"error": "error message string"
}
Состояние модели
доступhttp://host:port/v1/models/${MODEL_NAME}[/versions/${MODEL_VERSION}]
Интерфейс может получить информацию о состоянии указанной версии модели, где/versions/${MODEL_VERSION}
является необязательной частью, если она не указана, она вернет информацию о состоянии всех версий модели. Пример запроса и ответа показан ниже:
$ curl http://localhost:8501/v1/models/first_model/versions/0
{
"model_version_status": [
{
"version": "0",
"state": "AVAILABLE",
"status": {
"error_code": "OK",
"error_message": ""
}
}
]
}
Метаданные модели
доступhttp://host:port/v1/models/${MODEL_NAME}[/versions/${MODEL_VERSION}]/metadata
Интерфейс может получить информацию о метаданных указанной версии модели. в/versions/${MODEL_VERSION}
— необязательная часть, если она не указана, она вернет метаданные последней версии модели. Пример запроса и ответа показан ниже:
$ curl http://localhost:8501/v1/models/first_model/versions/0/metadata
{
"model_spec": {
"name": "first_model",
"signature_name": "",
"version": "0"
},
"metadata": {
"signature_def": {
"signature_def": {
"serving_default": {
"inputs": {
"input_1": {
"dtype": "DT_INT64",
"tensor_shape": {
"dim": [
{
"size": "-1",
"name": ""
},
{
"size": "31",
"name": ""
}
],
"unknown_rank": false
},
"name": "serving_default_input_1:0"
}
},
"outputs": {
"output_1": {
"dtype": "DT_FLOAT",
"tensor_shape": {
"dim": [
{
"size": "-1",
"name": ""
},
{
"size": "1",
"name": ""
}
],
"unknown_rank": false
},
"name": "StatefulPartitionedCall:0"
}
},
"method_name": "tensorflow/serving/predict"
},
"__saved_model_init_op": {
"inputs": {},
"outputs": {
"__saved_model_init_op": {
"dtype": "DT_INVALID",
"tensor_shape": {
"dim": [],
"unknown_rank": true
},
"name": "NoOp"
}
},
"method_name": ""
}
}
}
}
}
Информация метаданных содержит информацию о типе данных и размерности входного тензора модели, а также содержит имя входного тензора (key
), вотinput_1
, что очень важно для последующего использования данных для предсказания модели, поскольку данныеinput_key
и формат ввода должен соответствоватьmetadata
Определения остаются прежними.
Предсказание модели
доступhttp://host:port/v1/models/${MODEL_NAME}[/versions/${MODEL_VERSION}]:predict
Интерфейс может получить прогнозируемое значение указанных входных данных, то есть входных данных данной модели, и получить прогнозируемый выход модели. в/versions/${MODEL_VERSION}
— необязательная часть, если она не указана, по умолчанию для прогноза будет использоваться последняя версия модели.
Для доступа к этому интерфейсу необходимо предоставитьjson
формат запросаBody
, который имеет следующий формат:
{
// If unspecifed default serving signature is used.
"signature_name": "string",
// Input Tensors in row ("instances") or columnar ("inputs") format.
// A request can have either of them but NOT both.
"instances": <value>|<(nested)list>|<list-of-objects>
"inputs": <value>|<(nested)list>|<object>
}
вsignature_name
Представляет сигнатуру модели, если не указано, то по умолчаниюserving_default
.instances
иinputs
представляет входные данные модели в запрошенномBody
Один из них должен быть указан, а затем входные данные в указанном формате.
instances
Указывает, что входные данные для модели предоставляются в виде строк, которыеjson
Формат запроса следующий:
{
"instances": [
{
"input_1": [1, 1]
}
]
}
Также можно не указывать, если модель имеет только один вход с именем.input_key
,Тотjson
Формат запроса следующий:
{
"instances": [[1, 1]]
}
использоватьcurl
И пример создания запроса прогноза с использованием вышеизложенного показан ниже:
$ curl -d '{"instances": [{"input_1": [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}]}' -X POST http://localhost:8501/v1/models/first_model:predict
$ curl -d '{"instances": [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]]}' -X POST http://localhost:8501/v1/models/first_model:predict
{
"predictions": [
[
0.778520346
]
]
}
В этом ответеjson
изkey
заpredictions
,value
Значение представляет собой список, соответствующий выходному значению для каждого образца. Поскольку модель имеет только один выходной тензор, выходной тензор здесь опущен.key
ценностьoutput_1
.
inputs
Указывает, что входные данные для модели предоставляются в виде столбцов, которыеjson
Формат запроса следующий:
{
"inputs": {
"input_1": [[1, 1]]
}
}
Точно так же, когда модель имеет только один именованный вход, его также можно опустить.input_key
,Тотjson
Формат запроса следующий:
{
"inputs": [[1, 1]]
}
использоватьcurl
И пример создания запроса прогноза с использованием вышеизложенного показан ниже:
$ curl -d '{"inputs": {"input_1": [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]]}}' -X POST http://localhost:8501/v1/models/first_model:predict
$ curl -d '{"inputs": [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]]}' -X POST http://localhost:8501/v1/models/first_model:predict
{
"outputs": [
[
0.778520346
]
]
}
ответ здесьjson
изkey
заoutputs
,value
представляет собой список выходных значений, соответствующих каждому образцу. Поскольку модель имеет только один выходной тензор, выходной тензор здесь также опущен.key
ценностьoutput_1
.
Для моделей с несколькими входными тензорами и несколькими выходными тензорамиinstances
Пример запроса и ответа для метода ввода показан ниже:
{
"instances": [
{
"input_1": [1, 1],
"input_2": [1, 1, 1]
},
{
"input_1": [1, 1],
"input_2": [1, 1, 1]
}
]
}
{
"predictions": [
{
"output_1": [0.431975186],
"output_2": [0.382744759, 0.32798624, 0.289268941]
},
{
"output_1": [0.431975186],
"output_2": [0.382744759, 0.32798624, 0.289268941]
}
]
}
inputs
Пример запроса и ответа для метода ввода показан ниже:
{
"inputs": {
"input_1": [
[1, 1],
[1, 1]
],
"input_2": [
[1, 1, 1],
[1, 1, 1]
]
}
}
{
"outputs": {
"output_2": [[0.431975186], [0.431975186]],
"output_2": [
[0.382744759, 0.32798624, 0.289268941],
[0.382744759, 0.32798624, 0.289268941]
]
}
}
Подводя итог этим двум методам ввода,instances
Входные данные можно понимать как словарь (dict
) состоит из списка (list
) , каждый элемент словаря в списке является входной выборкой, словарьkey
имя входного тензора для модели,value
это значение, соответствующее тензору, который также является простым для понимания методом ввода; иinputs
Входные данные можно понимать как чистый словарь, словарьkey
имя входного тензора для модели иvalue
представляет собой список, каждый элемент в списке представляет собой значение, соответствующее выборке данных. Кроме того, для каждого метода ввода формат вывода ответа одинаков.
удаленный вызов gRPC
за исключением того, что вы можете использоватьHTTP
интерфейс для доступа к модели,TensorFlow Serving
также обеспечиваетgRPC
интерфейс для более эффективного выполнения запросов на доступ к модели.
Пока только официальнаяPython
соответствующий языкуgRPC API
, использовать, сначала установить иTensorFlow Serving
версия, соответствующаяpython
Сумкаtensorflow-serving-api
:pip install tensorflow-serving-api==2.2.0
, а затем используйте предоставленныйAPI
интерфейс дляgRPC
просить.
использоватьgRPC
проситьServing
УслугиPython
Пример кода для версии выглядит следующим образом:
import grpc
import tensorflow as tf
from absl import app, flags
import numpy as np
from tensorflow.core.framework import types_pb2
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc
flags.DEFINE_string(
'server',
'127.0.0.1:8500',
'PredictionService host:port',
)
FLAGS = flags.FLAGS
def main(_):
channel = grpc.insecure_channel(FLAGS.server)
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
request = predict_pb2.PredictRequest()
request.model_spec.name = 'first_model'
request.model_spec.signature_name = 'serving_default'
request.model_spec.version_label = "stable"
# request.model_spec.version.value = 0
data = np.ones((2, 31))
request.inputs['input_1'].CopyFrom(
tf.make_tensor_proto(data, dtype=types_pb2.DT_INT64))
request.output_filter.append('output_1')
result = stub.Predict(request, 10.0) # 10 secs timeout
print(result)
print(result.outputs["output_1"].float_val)
if __name__ == '__main__':
app.run(main)
Поток выполнения приведенного выше кода выглядит следующим образом:
- Сначала создайте
gRPC
ряд (channel
) и использовать канал для инициализации клиентской заглушки (stub
), который используется для вызова удаленногоPredict
функция. - Затем вам нужно инициализировать объект запроса
request
, и вам нужно указать некоторые значения атрибутов объекта запроса, такие как запрашиваемое имя модели, версия модели и входные тензорные данные и т. д. - последнее использование
stub
отправить запрос наServing
обслуживание и вернуть результат. - Если модель
outputs
изkey
Есть несколько значений, которые могут быть переданы черезoutput_filter
для фильтрации указанного вывода. Кроме того, черезoutput
изfloat_val
свойство, чтобы получить значение возвращаемого результата.
Выполните приведенный выше код, напечатанный результат выглядит следующим образом:
outputs {
key: "output_1"
value {
dtype: DT_FLOAT
tensor_shape {
dim {
size: 2
}
dim {
size: 1
}
}
float_val: 0.7785203456878662
}
}
model_spec {
name: "first_model"
version {
value: 1
}
signature_name: "serving_default"
}
[0.7785203456878662, 0.7785203456878662]
В реальной онлайн-среде прогнозирование данных часто является независимой службой, которая получает запросы данных от клиентов, а затем пересылает данные вServing
service для получения прогнозируемого значения и, наконец, возврата прогнозируемого результата. И этот сервис будет связан с большим количеством одновременных запросов от клиента, поэтому мы можем его не использовать.Python
framework для выполнения этой задачи и часто выбирают более зрелые, высокопроизводительные серверные фреймворки для переадресации запросов, такие какGo
лингвистическийgin
Ждатьweb
framework, они будут работать лучше в сценариях с высокой степенью параллелизма.
Чтобы использовать высокопроизводительные фреймворки на других языках, нам нужно установитьTensorFlow Serving gRPC API
библиотека для выполненияServing
запрос, а должностное лицо не предоставилоPython
языки, кромеgPRC API
, на данный момент нам нужно опираться на исходный код.proto
файл для создания соответствующегоAPI
файл кода.
API
Генерация файлов кода может быть переданаprotoc
инструменты для завершения, следует отметить, что,TensorFlow Serving
часть исходного кода.proto
файл будет зависеть отTensorFlow
часть исходного кода.proto
файл, поэтому с помощьюprotoc
При компиляции файла кода необходимоTensorFlow
иTensorFlow Serving
Коды обоих подтягиваются к локалке для унифицированной генерации.
Генерируется соответствующая языковая версияAPI
файл кода, вы можете использовать его сPython
похожийgRPC
интерфейс для доступаServing
услуга.
Модель локального тестирования
в сохраненномSavedModel
После форматирования модели помимо использованияTensorFlow Serving
В дополнение к сервису, загружающему модель для проверки, вы также можете использоватьSavedModel
инструмент командной строки (CLI
) для непосредственного просмотра сохраненной модели.CLI
позволяет быстро подтвердитьSavedModel
Типы данных входных и выходных тензоров и соответствие их размерностей тензорам в определении модели. Кроме того, вы также можете использоватьCLI
Выполните простой тест данных, чтобы проверить удобство использования модели, передав ей образцы данных и получив выходные данные модели.
CLI
Инструменты обычно устанавливаютсяTensorFlow
Она установлена в системе вместе с ней, представляет собой исполняемую программу, расположенную вTensorFlow
каталог установкиbin
каталог с именемsaved_model_cli
. можно использовать напрямуюsaved_model_cli -h
просмотретьCLI
Как пользоваться инструментом.
saved_model_cli
Есть две широко используемые операции, а именноshow
иrun
.
Показать информацию о модели
show
Действие означает просмотрSavedModel
основная информация, с доступом кHTTP
изmetadata
Интерфейс для получения метаданных аналогичен. Он используется так:
$ saved_model_cli show [-h] --dir DIR [--all] [--tag_set TAG_SET] [--signature_def SIGNATURE_DEF_KEY]
optional arguments:
-h, --help show this help message and exit
--dir DIR directory containing the SavedModel to inspect
--all if set, will output all information in given SavedModel
--tag_set TAG_SET tag-set of graph in SavedModel to show, separated by ','
--signature_def SIGNATURE_DEF_KEY key of SignatureDef to display input(s) and output(s) for
Например, чтобы просмотреть номер версии как0
изfirst_model
Основную информацию о модели можно получить с помощью следующей команды:
$ saved_model_cli show --dir /models/first_model/0 --tag_set serve --signature_def serving_default
The given SavedModel SignatureDef contains the following input(s):
inputs['input_1'] tensor_info:
dtype: DT_INT64
shape: (-1, 31)
name: serving_default_input_1:0
The given SavedModel SignatureDef contains the following output(s):
outputs['output_1'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: StatefulPartitionedCall:0
Method name is: tensorflow/serving/predict
Запустить модельную операцию
run
Операция означает выполнение вычислительной операции модели с заданными входными данными и возврат выходного результата. Он используется так:
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
операция обеспечивает3
способы ввода данных, они--inputs
,--input_exprs
а также--input_examples
, выполнениеrun
операции, это должно быть обеспечено3
методов ввода1
своего рода.
-
--inputs INPUTS
значит читать из файлаnumpy
массив в качестве входных данных,INPUTS
возможноinput_key=filename
иinput_key=filename[variable_name]
любой из1
формат,filename
Формат файла может быть.npy
,.npz
илиpickle
один изsaved_model_cli
Будет использоватьсяnumpy.load
способ загрузки файла.Когда формат файла
.npy
, массив в файле напрямую используется какinput_key
входные данные.Когда формат файла
.npz
, если указаноvariable_name
будет загружаться.npz
файл с именемvariable_name
из.npy
файл какinput_key
входные данные, если не указаноvariable_name
будет загружаться.npz
любой из.npy
файл какinput_key
входные данные.Когда формат файла
pickle
, если указаноvariable_name
Такsaved_model_cli
предположил быpickle
Данные, хранящиеся в файле, представляют собой словарь, а затем считываютсяvariable_name
соответствующийvalue
значение какinput_key
входные данные, если не указаноvariable_name
, то будетpickle
В файле все какinput_key
входные данные. -
--input_exprs INPUT_EXPRS
указать использованиеPython
выражение в качестве входных данных, нуждающихся в некоторых простых парах выборочных данныхSavedModel
Полезно для тестирования моделей. вINPUT_EXPRS
может быть таким же простым, какlist
какinput_key=[1, 1, 1]
так же может бытьnumpy
функции, такие какinput_key=np.ones((1, 3))
-
--input_examples INPUT_EXAMPLES
указать использованиеtf.train.Example
в качестве входных данных. вINPUT_EXAMPLES
Форматinput_key=[{"age":[22,24],"education":["BS","MS"]}]
,input_key
Значение словаря (dict
) Список (list
) , словарьkey
Введите название функции для модели,value
список значений для каждой характеристики (list
). Возможность использования этого метода ввода данных зависит отSavedModel
Основная информация о модели для принятия решения.
В общем, используйте--input_exprs INPUTS
Указание входных данных — самый быстрый и простой способ проверкиSavedModel
В том виде, в каком модель доступна, она используется следующим образом:
$ saved_model_cli run --dir /models/first_model/0 --tag_set serve --signature_def serving_default --input_expr "input_1=np.ones((1,31))"
INFO:tensorflow:Restoring parameters from /models/first_model/0/variables/variables
Result for output key output_1:
[[0.77852035]]