Как обрабатывать ввод .csv для использования в пакетном преобразовании Tensorflow Serving? - PullRequest
0 голосов
/ 04 августа 2020

Информация: Я загружаю существующую обученную model.tar.gz из корзины S3 и хочу выполнить пакетное преобразование с .csv, содержащим входные данные. Data.csv структурирован таким образом, что чтение его в pandas DataFrame дает мне строки с полными входными данными для прогнозов.

Примечания:
  • Это делается в Amazon Sagemaker с помощью Python SDK
  • BATCH_TRANSFORM_INPUT - это путь к data.csv.
  • Я могу загрузить содержимое внутри model.tar.gz и использовать его для вывода на моем локальном компьютере с помощью tenorflow и журналов покажите 2020-08-04 13:35:01.123557: I tensorflow_serving/core/loader_harness.cc:87] Successfully loaded servable version {name: model version: 1}, чтобы модель выглядела правильно обученной и сохраненной.
  • Файл data.csv имеет тот же формат, что и обучающие данные, что означает одну строку на «прогноз», где все столбцы в этом строка представляет различные функции.
  • Изменение стратегии аргумента на 'MultiRecord' дает ту же ошибку
  • [путь в s3] является заменой реального пути, поскольку я не хочу раскрывать любая информация о сегменте.
  • TensorFlow ModelServer: 2.0.0 + dev.sha.ab786af
  • Библиотека TensorFlow: 2.0.2

Где 1-5 - функции, файл data.csv выглядит так:

+------+-------------------------+---------+----------+---------+----------+----------+
| UNIT | TS                      | 1       | 2        | 3       | 4        | 5        |
+------+-------------------------+---------+----------+---------+----------+----------+
| 110  | 2018-01-01 00:01:00.000 | 1.81766 | 0.178043 | 1.33607 | 25.42162 | 12.85445 |
+------+-------------------------+---------+----------+---------+----------+----------+
| 110  | 2018-01-01 00:02:00.000 | 1.81673 | 0.178168 | 1.30159 | 25.48204 | 12.87305 |
+------+-------------------------+---------+----------+---------+----------+----------+
| 110  | 2018-01-01 00:03:00.000 | 1.8155  | 0.176242 | 1.38399 | 25.35309 | 12.47222 |
+------+-------------------------+---------+----------+---------+----------+----------+
| 110  | 2018-01-01 00:04:00.000 | 1.81530 | 0.176398 | 1.39781 | 25.18216 | 12.16837 |
+------+-------------------------+---------+----------+---------+----------+----------+
| 110  | 2018-01-01 00:05:00.000 | 1.81505 | 0.151682 | 1.38451 | 25.22351 | 12.41623 |
+------+-------------------------+---------+----------+---------+----------+----------+

inference.py в настоящее время выглядит так:

def input_handler(data, context):
    import pandas as pd
    if context.request_content_type == 'text/csv':
        payload = pd.read_csv(data)
        instance = [{"dataset": payload}]
        return json.dumps({"instances": instance})
    else:
        _return_error(416, 'Unsupported content type "{}"'.format(context.request_content_type or 'Unknown'))

Проблема:

Когда в моем блокноте jupyter выполняется следующий код:

sagemaker_model = Model(model_data = '[path in s3]/savedmodel/model.tar.gz'),  
                        sagemaker_session=sagemaker_session,
                        role = role,
                        framework_version='2.0',
                        entry_point = os.path.join('training', 'inference.py')
                        )

tf_serving_transformer = sagemaker_model.transformer(instance_count=1,
                                                     instance_type='ml.p2.xlarge',
                                                     max_payload=1,
                                                     output_path=BATCH_TRANSFORM_OUTPUT_DIR,
                                                     strategy='SingleRecord')


tf_serving_transformer.transform(data=BATCH_TRANSFORM_INPUT, data_type='S3Prefix', content_type='text/csv')
tf_serving_transformer.wait()

Модель, кажется, загружается, но я получаю следующую ошибку: 2020-08-04T09:54:27.415:[sagemaker logs]: MaxConcurrentTransforms=1, MaxPayloadInMB=1, BatchStrategy=SINGLE_RECORD 2020-08-04T09:54:27.503:[sagemaker logs]: [path in s3]/data.csv: ClientError: 400 2020-08-04T09:54:27.503:[sagemaker logs]: [path in s3]/data.csv: 2020-08-04T09:54:27.503:[sagemaker logs]: [path in s3]/data.csv: Message: 2020-08-04T09:54:27.503:[sagemaker logs]: [path in s3]/data.csv: { "error": "Failed to process element: 0 of 'instances' list. Error: Invalid argument: JSON Value: \"\" Type: String is not of expected type: float" }

Ошибка более четко:

ClientError: 400 Сообщение: { "error": "Не удалось обработать элемент: 0 из списка экземпляров. Ошибка: недопустимый аргумент: JSON Значение: "" Тип: строка не ожидаемого типа: float "}

Если я правильно понимаю эту ошибку, что-то не так с тем, как мои данные структурированы , так что sagemaker не может доставить входные данные в модель TFS. Я полагаю, что в моем inference.py отсутствует некоторая "обработка ввода". Возможно, данные CSV нужно как-то преобразовать в совместимый JSON, чтобы TFS использовать его? Что именно должно быть сделано в input_handler ()?

Я ценю любую помощь и прошу прощения за этот запутанный случай. Если вам нужна дополнительная информация, спросите, и я с радостью предоставлю то, что Я могу.

1 Ответ

0 голосов
/ 06 августа 2020

Решение: Проблема была решена путем сохранения фрейма данных как .csv с использованием аргументов header = False, index = False. Это заставляет сохраненный csv не включать метки индексации фрейма данных. TFS принимает чистый .csv только со значениями с плавающей запятой (без меток). Я предполагаю, что сообщение об ошибке Недействительный аргумент: JSON Значение: "" Тип: Строка не ожидаемого типа: float относится к первой ячейке в CSV, которая, если CSV был экспортирован с метками, просто пустая ячейка. Когда вместо значения с плавающей запятой он получил пустую строку, он запутался.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...