Ошибка проверки работоспособности ping после развертывания модели TF2.1 с TF-servicing-container на AWS Sagemaker - PullRequest
1 голос
/ 09 июля 2020

Мы хотим развернуть обученную модель Tensorflow в AWS Sagemaker для вывода с помощью контейнера-тензора-потока. Версия Tensorflow - 2.1. Следуя руководству на https://github.com/aws/sagemaker-tensorflow-serving-container, были предприняты следующие шаги:

  1. Построить TF 2.1 AMI и опубликовать sh его в AWS ECR после успешного локального тестирования
  2. Установка разрешений для ролей выполнения Sagemaker для S3 и ECR.
  3. Упаковать сохраненную папку модели TF (saved_model.pb, активы, переменные) в model.tar.gz
  4. Создана конечная точка в реальном времени предсказатель:
import os
import sagemaker
from sagemaker.tensorflow.serving import Model
from sagemaker.tensorflow.model import TensorFlowModel
from sagemaker.predictor import json_deserializer, json_serializer, RealTimePredictor
from sagemaker.content_types import CONTENT_TYPE_JSON

def create_tfs_sagemaker_model():
    sagemaker_session = sagemaker.Session()
    role = 'arn:aws:iam::XXXXXXXXX:role/service-role/AmazonSageMaker-ExecutionRole-XXXXXXX
    bucket = 'tf-serving'
    prefix = 'sagemaker/tfs-test'
    s3_path = 's3://{}/{}'.format(bucket, prefix)
    image = 'XXXXXXXX.dkr.ecr.eu-central-1.amazonaws.com/sagemaker-tensorflow-serving:2.1.0-cpu'
    model_data = sagemaker_session.upload_data('model.tar.gz', bucket, os.path.join(prefix, 'model'))
    endpoint_name = 'tf-serving-ep-test-1'
    tensorflow_serving_model = Model(model_data=model_data, role=role, sagemaker_session=sagemaker_session, image=image, framework_version='2.1')
    tensorflow_serving_model.deploy(initial_instance_count=1, instance_type='ml.c4.xlarge', endpoint_name=endpoint_name)
    rt_predictor = RealTimePredictor(endpoint=endpoint_name, sagemaker_session=sagemaker_session, serializer=json_serializer, content_type=CONTENT_TYPE_JSON, accept=CONTENT_TYPE_JSON)
Создание задания пакетного преобразования:
def create_tfs_sagemaker_batch_transform():
    sagemaker_session = sagemaker.Session()
    print(sagemaker_session.boto_region_name)
    role = 'arn:aws:iam::XXXXXXXXXXX:role/service-role/AmazonSageMaker-ExecutionRole-XXXXXXXX'
    bucket = 'XXXXXXX-tf-serving'
    prefix = 'sagemaker/tfs-test'
    image = 'XXXXXXXXXX.dkr.ecr.eu-central-1.amazonaws.com/sagemaker-tensorflow-serving:2.1.0-cpu'
    s3_path = 's3://{}/{}'.format(bucket, prefix)
    model_data = sagemaker_session.upload_data('model.tar.gz', bucket, os.path.join(prefix, 'model'))
    tensorflow_serving_model = Model(model_data=model_data, role=role, sagemaker_session=sagemaker_session, image=image, name='deep-net-0', framework_version='2.1')
    print(tensorflow_serving_model.model_data)
    out_path = 's3://XXXXXX-serving-out/'
    input_path = "s3://XXXXXX-serving-in/"    
    tensorflow_serving_transformer = tensorflow_serving_model.transformer(instance_count=1, instance_type='ml.c4.xlarge', accept='application/json', output_path=out_path)
    tensorflow_serving_transformer.transform(input_path, content_type='application/json')

Выполняются шаги 4 и 5, и в журналах AWS Cloudwatch мы видим успешный запуск экземпляров, загрузку модели и TF -Поддержка входа в событие l oop - см. Ниже:

2020-07-08T17: 07: 16.156 + 02: 00 INFO: main : запуск услуг

2020-07-08T17: 07: 16.156 + 02: 00 ИНФОРМАЦИЯ: main : nginx config:

2020-07-08T17: 07: 16.156 + 02: 00 load_module modules / ngx_http_js_module.so;

2020-07-08T17: 07: 16.156 + 02: 00 worker_processes auto;

2020-07-08T17: 07: 16.156 + 02: 00 демон выключен ;

2020-07-08T17: 07: 16.156 + 02: 00 pid /tmp/nginx.pid;

2020-07-08T17: 07: 16.157 + 02: 00 error_log / dev / stderr error;

2020-07-08T17: 07: 16.157 + 02: 00 worker_rlimit_nofile 4096;

2020-07-08T17: 07: 16.157 + 02: 00 события {worker_connections 2048;

2020-07-08T17: 07: 16.157 + 02: 00}

2020-07-08T17: 07: 16.162 + 02: 00 http {include / e tc / nginx / mime.types; default_type application / json; access_log / dev / stdout объединены; js_include tensorflow-serve.js; восходящий поток tfs_upstream {локальный сервер сервера: 10001; } восходящий поток gunicorn_upstream {сервер unix: / tmp / gunicorn.sock fail_timeout = 1; } сервер {прослушивание 8080 отложено; client_max_body_size 0; client_body_buffer_size 100 м; subrequest_output_buffer_size 100 м; установить $ tfs_version 2.1; установить $ default_tfs_model Нет; расположение / tfs {rewrite ^ / tfs /(.*) / $ 1 перерыв; proxy_redirect выключен; proxy_pass_request_headers выключен; proxy_set_header Content-Type 'application / json'; proxy_set_header Принять 'приложение / json'; proxy_pass http://tfs_upstream;} расположение / пинг {js_content ping; } местоположение / вызовы {js_content invocations; } местоположение / модели {proxy_pass http://gunicorn_upstream / модели; } location / {return 404 '{"error": "Not Found"}'; } keepalive_timeout 3; }

2020-07-08T17: 07: 16.162 + 02: 00}

2020-07-08T17: 07: 16.162 + 02: 00 INFO: tfs_utils: с использованием имени модели по умолчанию: model

2020-07-08T17: 07: 16.162 + 02: 00 ИНФОРМАЦИЯ: tfs_utils: конфигурация модели обслуживания tenorflow:

2020-07-08T17: 07: 16.162 + 02: 00 model_config_list: { config: {name: "model", base_path: "/ opt / ml / model", model_platform: "tensorflow"}

2020-07-08T17: 07: 16.162 + 02: 00}

2020-07-08T17: 07: 16.162 + 02: 00 INFO: main : с использованием названия модели по умолчанию: model

2020-07-08T17: 07: 16.162 + 02: 00 ИНФОРМАЦИЯ: main : конфигурация модели обслуживания тензорного потока:

2020-07-08T17: 07: 16.163 + 02: 00 model_config_list: {config: {name: "model", base_path: "/ opt / ml / model ", model_platform:" tensorflow "}

2020-07-08T17: 07: 16.163 + 02: 00}

2020-07-08T17: 07: 16.163 + 02 : 00 ИНФОРМАЦИЯ: основная : информация о версии тензорного потока:

2020-07-08T17: 07: 16.163 + 02: 00 TensorFlow ModelServer: 2.1.0-rc1 + dev.sha.075ffcf

2020-07 -08T17: 07: 16.163 + 02: 00 Библиотека TensorFlow: 2.1.0

2020-07-08T17: 07: 16.163 + 02: 00 ИНФОРМАЦИЯ: main : команда обслуживания тензорного потока: tensorflow_model_server --port = 10000 --rest_api_port = 10001 --model_config_file = / sagemaker / model-config.cfg --max_num_load_retries = 0

2020-07-08T17: 07: 16.163 + 02: 00 ИНФОРМАЦИЯ: main : запущено обслуживание тензорного потока (pid: 13)

2020-07-08T17: 07: 16.163 + 02: 00 INFO: main : nginx информация о версии:

2020-07-08T17: 07: 16.163 + 02: 00 nginx версия: nginx / 1.18.0

2020-07-08T17: 07: 16. 163 + 02: 00, созданный g cc 7.4.0 (Ubuntu 7.4.0-1ubuntu1 ~ 18.04.1)

2020-07-08T17: 07: 16.163 + 02: 00, построенный с OpenSSL 1.1. 1 11 сен 2018

2020-07-08T17: 07: 16.163 + 02: 00 Поддержка TLS SNI включена

2020-07-08T17: 07: 16.163 + 02: 00 настроить аргументы: - -prefix = / etc / nginx --sbin-path = / usr / sbin / nginx --modules-path = / usr / lib / nginx / modules --conf-path = / etc / nginx / nginx. conf --error-log-path = / var / log / nginx / error.log --http-log-path = / var / log / nginx / access.log --pid-path = / var / run / nginx .pid --lock-path = / var / run / nginx .lock --http-client-body-temp-path = / var / cache / nginx / client_temp --http-proxy-temp-path = / var / cache / nginx / proxy_temp --http-fastcgi-temp-path = / var / cache / nginx / fastcgi_temp --http-uwsgi-temp-path = / var / cache / nginx / uwsgi_temp --http-scgi-temp -path = / var / cache / nginx / scgi_temp --user = nginx --group = nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with -http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_g unzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_ssl_module --with-http_ssl_module --with-http_ssl_module http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with- cc -opt = '- g -O2 -fdebug-prefix -map = / data / builder / debuild / nginx -1.18.0 / debian / debuild-base / nginx -1.18.0 =. -fstack-protector-strong -Wformat -Werror = format-security -Wp, -D_FORTIFY_SOURCE = 2 -fPI C '--with-ld-opt =' - Wl, -Bsymboli c -functions -Wl, - z, relro -Wl, -z, now -Wl, - по необходимости -p ie '

2020-07-08T17: 07: 16.163 + 02: 00 ИНФОРМАЦИЯ: main : запущено nginx (pid: 15)

2020-07-08T17: 07: 16.163 + 02: 00 2020-07-08 15: 07: 15.075708: I tensorflow_serving / model_servers / server_core. cc: 462] Добавление / обновление моделей.

2020-07-08T17: 07: 16.163 + 02: 00 2020-07-08 15: 07: 15.075760: I tensorflow_serving / model_servers / server_core. cc : 573] (Повторное) добавление модели: model

2020-07-08T17: 07: 16.163 + 02: 00 2020-07-08 15: 07: 15.180755: I tensorflow_serving / util / retrier. cc: 46] Повторная попытка зарезервировать ресурсы для обслуживаемого: {name: model version: 1} исчерпано max_num_retries: 0

2020-07-08T17: 07: 16.163 + 02: 00 2020-07-08 15:07 : 15.180887: I tensorflow_serving / core / basic_manager. cc: 739] Ресурсы успешно зарезервированы для загрузки обслуживаемого {name: model version: 1}

2020-07-08T17: 07: 16.163 + 02: 00 2020-07-08 15: 07: 15.180919: I tensorflow_serving / core / loader_harness. cc: 66] Утверждение нагрузки для обслуживаемой версии {name: model версия: 1}

2020-07-08T17: 07: 16.163 + 02: 00 2020-07-08 15: 07: 15.180944: I tensorflow_serving / core / loader_harness. cc: 74] Загрузка обслуживаемой версии {name: model version: 1}

2020-07-08T17: 07: 16.163 + 02: 00 2020-07-08 15: 07: 15.180995: I external / org_tensorflow / tensorflow / cc / saved_model / reader . cc: 31] Чтение SavedModel из: / opt / ml / model / 1

2020-07-08T17: 07: 16.163 + 02: 00 2020-07-08 15: 07: 15.205712: I external / org_tensorflow / tensorflow / cc / saved_model / reader. cc: 54] Чтение мета-графа с тегами {serve}

2020-07-08T17: 07: 16.164 + 02: 00 2020-07-08 15: 07: 15.205825: I external / org_tensorflow / tensorflow / cc / saved_model / loader. cc: 264] Чтение отладочной информации SavedModel (если есть) из: / opt / ml / model / 1

2020 -07-08T17: 07: 16.164 + 02: 00 2020-07-08 15: 07: 15.208599: I внешний / или g_tensorflow / tensorflow / core / common_runtime / process_util. cc: 147] Создание нового пула потоков с настройкой взаимодействия по умолчанию: 2. Настройте использование inter_op_parallelism_threads для лучшей производительности.

2020-07-08T17: 07: 16.164 +02: 00 2020-07-08 15: 07: 15.328057: I external / org_tensorflow / tensorflow / cc / saved_model / loader. cc: 203] Восстановление пакета SavedModel.

2020-07-08T17: 07: 17.165 + 02: 00 2020-07-08 15: 07: 16.578796: I external / org_tensorflow / tensorflow / cc / saved_model / loader. cc: 152] Выполнение операции инициализации для пакета SavedModel по пути: / opt / ml / model / 1

2020-07-08T17: 07: 17.165 +02: 00 2020-07-08 15: 07: 16.626494: I external / org_tensorflow / tensorflow / cc / saved_model / loader. cc: 333] SavedModel загрузка для тегов {serve}; Статус: успех: ОК. Заняло 1445495 микросекунд.

2020-07-08T17: 07: 17.165 + 02: 00 2020-07-08 15: 07: 16.630443: I tensorflow_serving / servables / tensorflow / saved_model_warmup. cc: 105] Нет Файл данных разминки находится по адресу /opt/ml/model/1/assets.extra/tf_serving_warmup_requests

2020-07-08T17: 07: 17.165 + 02: 00 2020-07-08 15: 07: 16.632461: I tensorflow_serving / util / retrier. cc: 46] Повторная загрузка обслуживаемого объекта: {name: model version: 1} исчерпано max_num_retries: 0

2020-07-08T17: 07: 17.165 + 02: 00 2020- 07-08 15: 07: 16.632484: I tensorflow_serving / core / loader_harness. cc: 87] Успешно загружена обслуживаемая версия {name: model version: 1}

2020-07-08T17: 07: 17.165+ 02:00 2020-07-08 15: 07: 16.634727: I tensorflow_serving / model_servers / server. cc: 362] Запуск gRPC ModelServer на 0.0.0.0:10000 ...

2020-07-08T17 : 07: 17.165 + 02: 00 [предупреждение] getaddrinfo: семейство адресов для nodename не поддерживается

2020-07-08T17: 07: 17.165 + 02: 00 2020-07-08 15: 07: 16.635747: I tenorflow_servi ng / model_servers / server. cc: 382] Экспорт HTTP / REST API на: localhost: 10001 ...

2020-07-08T17: 07: 17.165 + 02: 00 [evhttp_server. cc : 238] NET_LOG: ввод события l oop…

Но оба (конечная точка и пакетное преобразование) не проходят проверку работоспособности Sagemaker Ping с помощью:

2020-07 -08T17: 07: 32.169 + 02: 00 2020/07/08 15:07:31 [ошибка] 16 # 16: * 1 js: не удалось проверить связь {"ошибка": "Не удалось найти ни одной версии модели None" }

2020-07-08T17: 07: 32.170 + 02: 00 169.254.255.130 - - [08 / июл / 2020: 15: 07: 31 +0000] «GET / ping HTTP / 1.1» 502 157 "-" "Go -http-client / 1.1"

Кроме того, при локальном тестировании с самостоятельно созданным docker tf-serve-container модель работает без проблем и может быть запрошена с помощью завиток. В чем может быть проблема?

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Похоже, что ваша модель названа "model" для обслуживания TensorFlow ранее в журналах:

2020-07-08T17:07:16.162+02:00 INFO:main:using default model name: model
2020-07-08T17:07:16.162+02:00 INFO:main:tensorflow serving model config:

, но в случае ошибки проверка ping направляется в службу TensorFlow как модель с именем: `" None "

`Could not find any versions of model None`

Я не уверен, происходит ли эта ошибка из-за контейнера Docker или на стороне SageMaker. Но ... Я нашел эту подозрительную переменную среды TFS_DEFAULT_MODEL_NAME, для которой по умолчанию установлено значение "None":

class PythonServiceResource:

    def __init__(self):
        if SAGEMAKER_MULTI_MODEL_ENABLED:
            self._model_tfs_rest_port = {}
            self._model_tfs_grpc_port = {}
            self._model_tfs_pid = {}
            self._tfs_ports = self._parse_sagemaker_port_range(SAGEMAKER_TFS_PORT_RANGE)
        else:
            self._tfs_grpc_port = TFS_GRPC_PORT
            self._tfs_rest_port = TFS_REST_PORT

        self._tfs_enable_batching = SAGEMAKER_BATCHING_ENABLED == 'true'
        self._tfs_default_model_name = os.environ.get('TFS_DEFAULT_MODEL_NAME', "None")

Не могли бы вы попробовать установить TFS_DEFAULT_MODEL_NAME в своем контейнере и посмотреть, что произойдет?

Если это не сработает, возможно, вы добьетесь большего успеха, разместив ошибку в контейнере TensorFlow SageMaker на github . Эксперты Amazon проверяют это довольно регулярно.

Кстати, я хотел бы поболтать подробнее о том, как вы используете конечные точки SageMaker с моделями TensorFlow, для некоторых исследований, которые я проводил. Если вы готовы, напишите мне по электронной почте на yoavz@modelzoo.dev.

0 голосов
/ 16 июля 2020

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

Переменная среды «SAGEMAKER_TFS_DEFAULT_MODEL_NAME» должна быть установлена ​​на правильное имя модели, например, «модель»

import os
import sagemaker
from sagemaker.tensorflow.serving import Model
from sagemaker.tensorflow.model import TensorFlowModel
from sagemaker.predictor import json_deserializer, json_serializer, RealTimePredictor
from sagemaker.content_types import CONTENT_TYPE_JSON

def create_tfs_sagemaker_model():
    sagemaker_session = sagemaker.Session()
    role = 'arn:aws:iam::XXXXXXXXX:role/service-role/AmazonSageMaker-ExecutionRole-XXXXXXX
    bucket = 'tf-serving'
    prefix = 'sagemaker/tfs-test'
    s3_path = 's3://{}/{}'.format(bucket, prefix)
    image = 'XXXXXXXX.dkr.ecr.eu-central-1.amazonaws.com/sagemaker-tensorflow-serving:2.1.0-cpu'
    model_data = sagemaker_session.upload_data('model.tar.gz', bucket, os.path.join(prefix, 'model'))
    endpoint_name = 'tf-serving-ep-test-1'
    env = {"SAGEMAKER_TFS_DEFAULT_MODEL_NAME": "model"}
    tensorflow_serving_model = Model(model_data=model_data, role=role, sagemaker_session=sagemaker_session, image=image, name='model', framework_version='2.1', env=env)
    tensorflow_serving_model.deploy(initial_instance_count=1, instance_type='ml.c4.xlarge', endpoint_name=endpoint_name)
    rt_predictor = RealTimePredictor(endpoint=endpoint_name, sagemaker_session=sagemaker_session, serializer=json_serializer, content_type=CONTENT_TYPE_JSON, accept=CONTENT_TYPE_JSON)

Это создает конечную точку правильно и проходит проверка работоспособности ping с помощью:

2020-07-16T12: 08: 20.654 + 02: 00 10.32.0.2 - - [16 / Jul / 2020: 10: 08: 20 +0000] "GET / ping HTTP /1.1 "200 0" - "" AHC / 2.0 "

...