Почему я не могу вызвать конечную точку sagemaker с байтами или файлом в качестве полезной нагрузки - PullRequest
0 голосов
/ 11 января 2020

Я развернул модель линейной регрессии на Sagemaker. Теперь я хочу написать лямбда-функцию для прогнозирования входных данных. Файлы извлекаются из S3 в первую очередь. Некоторая предварительная обработка завершена, и окончательным вводом является pandas кадр данных. Согласно документации boto3 sagemaker, полезная нагрузка может быть как байтовой, так и файловой. Поэтому я попытался преобразовать фрейм данных в байтовый массив, используя код из этого поста

# Convert pandas dataframe to byte array
pred_np = pred_df.to_records(index=False)
pred_str = pred_np.tostring()

# Start sagemaker prediction
sm_runtime = aws_session.client('runtime.sagemaker')
response = sm_runtime.invoke_endpoint(
    EndpointName=SAGEMAKER_ENDPOINT,
    Body=pred_str,
    ContentType='text/csv',
    Accept='Accept')

Я распечатал pred_str, который мне кажется байтовым массивом. enter image description here

Однако, когда я запускаю его, я получаю следующее Algorithm Error, вызванное UnicodeDecodeError:

Caused by: 'utf8' codec can't decode byte 0xed in position 9: invalid continuation byte

Трассировка показывает python 2.7 не уверен, почему это так:

Traceback (most recent call last):
  File "/opt/amazon/lib/python2.7/site-packages/ai_algorithms_sdk/serve.py", line 465, in invocations
    data_iter = get_data_iterator(payload, **content_parameters)
  File "/opt/amazon/lib/python2.7/site-packages/ai_algorithms_sdk/io/serve_helpers.py", line 99, in iterator_csv_dense_rank_2
    payload = payload.decode("utf8")
  File "/opt/amazon/python2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)

Является ли декодер по умолчанию utf_8? Какой правильный декодер я должен использовать? Почему он жалуется на позицию 9?

Кроме того, я также попытался сохранить фрейм данных в файл csv и использовать его в качестве полезной нагрузки

pred_df.to_csv('pred.csv', index=False)
with open('pred.csv', 'rb') as f:
    payload = f.read()
response = sm_runtime.invoke_endpoint(
    EndpointName=SAGEMAKER_ENDPOINT,
    Body=payload,
    ContentType='text/csv',
    Accept='Accept')

Однако при запуске я получил следующее ошибка:

Customer Error: Unable to parse payload. Some rows may have more columns than others and/or non-numeric values may be present in the csv data.

И снова трассировка вызывает python 2.7:

Traceback (most recent call last):
  File "/opt/amazon/lib/python2.7/site-packages/ai_algorithms_sdk/serve.py", line 465, in invocations
    data_iter = get_data_iterator(payload, **content_parameters)
  File "/opt/amazon/lib/python2.7/site-packages/ai_algorithms_sdk/io/serve_helpers.py", line 123, in iterator_csv_dense_rank_2

Это вообще не имеет смысла, потому что это стандартный 6x78 фрейм данных. Все строки имеют одинаковое количество столбцов. Плюс ни один из столбцов не является числовым c. enter image description here Как исправить эту проблему с мудрецом?

1 Ответ

0 голосов
/ 16 января 2020

Я наконец-то смог заставить его работать со следующим кодом:

payload = io.StringIO()
pred_df.to_csv(payload, header=None, index=None)

sm_runtime = aws_session.client('runtime.sagemaker')
response = sm_runtime.invoke_endpoint(
    EndpointName=SAGEMAKER_ENDPOINT,
    Body=payload.getvalue(),
    ContentType='text/csv',
    Accept='Accept')

Очень важно вызывать функцию getvalue() для полезной нагрузки при вызове конечной точки. Надеюсь, это поможет

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