Статьи по TensorFlow|Обслуживание модели TensorFlow 2.x

TensorFlow

"Введение«После завершения обучения модели нам нужно использовать сохраненную модель для онлайн-прогнозирования, то есть сервис 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Сервис тонко настроен для достижения нужного эффекта. Ниже приводится краткое введение в некоторые из наиболее важных параметров запуска:

  1. --port:gRPCПорт прослушивания службы, по умолчанию8500порт.
  2. --rest_api_port:HTTPПорт прослушивания службы, по умолчанию8501порт.
  3. --rest_api_timeout_in_ms:HTTPОграничение времени ожидания запроса (миллисекунды), по умолчанию30000миллисекунда.
  4. --model_config_file: путь к файлу конфигурации модели.
  5. --model_config_file_poll_wait_seconds: интервал (в секундах) для периодической загрузки файла конфигурации модели, по умолчанию0,ВыражатьServingПосле запуска службы она больше не загружается периодически.
  6. --file_system_poll_wait_seconds: интервал (в секундах) для периодической загрузки новых версий модели, по умолчанию1второй.
  7. --enable_batching:bool, следует ли включить пакетную операцию запроса, по умолчаниюfalse.
  8. --batching_parameters_file: Путь к файлу конфигурации параметров для пакетных операций.
  9. --monitoring_config_file: путь к файлу конфигурации для мониторинга.
  10. --allow_version_labels_for_unavailable_models:bool, можно ли назначать метки еще не загруженным моделям, по умолчаниюfalse.
  11. --model_name: название модели, в одиночной моделиServingпри использовании.
  12. --model_base_path: путь загрузки модели, в одиночной моделиServingпри использовании.
  13. --enable_model_warmup:bool, использовать ли данные для прогрева модели, чтобы уменьшить задержку ответа на первый запрос, по умолчаниюfalse. так какTensorFlowВ среде выполнения есть компоненты, которые инициализируются лениво, что может привести к длительному времени ответа на первый запрос, отправленный к модели после загрузки модели, и эта задержка может быть на несколько порядков выше, чем время, необходимое для одного запроса. Чтобы уменьшить влияние ленивой инициализации на ответ на запрос, можно предоставить набор образцов запроса для запуска инициализации компонента при загрузке модели.Этот процесс называется模型预热.
  14. Дополнительные параметры запуска можно найти в исходном коде.

Полный пример

Полностью настроенная мультимодель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)

Поток выполнения приведенного выше кода выглядит следующим образом:

  1. Сначала создайтеgRPCряд (channel) и использовать канал для инициализации клиентской заглушки (stub), который используется для вызова удаленногоPredictфункция.
  2. Затем вам нужно инициализировать объект запросаrequest, и вам нужно указать некоторые значения атрибутов объекта запроса, такие как запрашиваемое имя модели, версия модели и входные тензорные данные и т. д.
  3. последнее использованиеstubотправить запрос наServingобслуживание и вернуть результат.
  4. Если модель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]

В реальной онлайн-среде прогнозирование данных часто является независимой службой, которая получает запросы данных от клиентов, а затем пересылает данные вServingservice для получения прогнозируемого значения и, наконец, возврата прогнозируемого результата. И этот сервис будет связан с большим количеством одновременных запросов от клиента, поэтому мы можем его не использовать.Pythonframework для выполнения этой задачи и часто выбирают более зрелые, высокопроизводительные серверные фреймворки для переадресации запросов, такие какGoлингвистическийginЖдатьwebframework, они будут работать лучше в сценариях с высокой степенью параллелизма.

Чтобы использовать высокопроизводительные фреймворки на других языках, нам нужно установить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своего рода.

  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входные данные.

  2. --input_exprs INPUT_EXPRSуказать использованиеPythonвыражение в качестве входных данных, нуждающихся в некоторых простых парах выборочных данныхSavedModelПолезно для тестирования моделей. вINPUT_EXPRSможет быть таким же простым, какlistкакinput_key=[1, 1, 1]так же может бытьnumpyфункции, такие какinput_key=np.ones((1, 3))

  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]]

использованная литература

  1. TensorFlow Serving with Docker
  2. TensorFlow Serving Configuration
  3. TensorFlow Serving RESTful API
  4. SavedModel Command Line Interface
  5. Python GRPC Client Example