Информация: Я загружаю существующую обученную 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 ()?
Я ценю любую помощь и прошу прощения за этот запутанный случай. Если вам нужна дополнительная информация, спросите, и я с радостью предоставлю то, что Я могу.