Правильный способ сделать запрос к модели, развернутой с помощью Azure ML Designer

Я пытаюсь отправить POST-запрос в конечную точку Azure ML Designer (модель, которую я развернул). Вот мой код:

import requests

scoring_uri = 'http:some-url/score'
key = 'someKey'

headers = {'Content-Type': 'application/json'}
headers['Authorization'] = f'Bearer {key}'

response = requests.get('https://www.okino.ua/media/var/news/2019/12/04/Quentin_Tarantino.jpg')

input_data = "{\"data\": [" + str(response.content) + "]}"
resp = requests.post(scoring_uri, data=response.content, headers=headers)
print(resp.text)

И я получаю сообщение об ошибке:

{"error": {"code": 400, "message": "Input Data Error. Input data are inconsistent with schema.\nSchema: {'WebServiceInput0': {'columnAttributes': [{'name': 'image', 'type': 'Bytes', 'isFeature': True, 'elementType': {'typeName': 'bytes', 'isNullable': False}, 'properties': {'mime_type': 'image/png', 'image_ref': 'image_info'}}, {'name': 'id', 'type': 'Numeri\nData: b'\\xff\\xd8\\xff\\xe0\\x00\\x10JFIF\\x00\\x01\\x01\\x01\\x01,\\x01,\\x00\\x00\\xff\\xfe\\x00[Copyright Shutterstock 2019;82139424;3600;2400;1563865756;Tue, 23 Jul 2019 07:09:16 GMT;0\\xff\\xed\\x04\\x16Photoshop 3.0\\x008BIM\\x04\\x04\\x00\\x00\\x00\\x00\\x03\\xf9\\x1c\\x02\\x05\\x00\\n103\nTraceback (most recent call last):\n  File \"/azureml-envs/azureml_c1330288c44b762b0282b6f129c5292f/lib/python3.6/site-packages/azureml/designer/serving/dagengine/processor.py\", line 18, in run\n    webservice_input, global_parameters = self.pre_process(raw_data)\n  File \"/azureml-envs/azureml_c1330288c44b762b0282b6f129c5292f/lib/python3.6/site-packages/azureml/designer/serving/dagengine/processor.py\", line 45, in pre_process\n    json_data = json.loads(raw_data)\n  File \"/azureml-envs/azureml_c1330288c44b762b0282b6f129c5292f/lib/python3.6/json/__init__.py\", line 349, in loads\n    s = s.decode(detect_encoding(s), 'surrogatepass')\nUnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte\n", "details": ""}}

Кто-нибудь знает, как передать данные изображения в конечную точку Azure ML?


person BLukash    schedule 27.11.2020    source источник
comment
на самом деле URL-адрес изображения, который я использовал в GET в приведенном выше примере, кажется, защищен CORS, но результат не меняется после использования любого другого URL-адреса изображения   -  person BLukash    schedule 28.11.2020


Ответы (1)


Причина, по которой вы получаете указанную ниже ошибку, заключается в том, что вы не передали входные данные / тело POST в требуемом формате / схеме.

Чтобы получить схему, вы можете либо следовать схеме, упомянутой в ошибке, либо получить ее из файла SWAGGER.JSON.

Я предпочитаю SWAGGER.JSON, потому что он дает пример использования и доступные конечные точки. Итак, детализируем шаги ниже. Но если вам удобно создавать тело POST с ошибкой, это хорошо.

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

Обычно это GET https://ServiceURI.io/Swagger.json. Если вы получите 404 или любую ошибку, вы можете проверить журналы развертывания, вы можете найти путь для Swagger.JSON.

введите описание изображения здесь

Так что в моем случае это было https://<ServiceURI.io>/swagger.json

Вы можете нажать на указанный выше URL-адрес с помощью метода GET, вам будет предоставлен выходной файл JSON.

Ответ, как показано ниже:

введите описание изображения здесь

Скопируйте вывод JSON и вставьте его в редактор Swagger (https://editor.swagger.io/) [Вы также можете попробовать прочитать файл JSON напрямую, не анализируя его в редакторе Swagger]

У вас будет проанализированная версия файла Swagger, и вы быстро поймете, как должна использоваться ваша конечная точка (какие глаголы и параметры можно использовать с образцом)

введите описание изображения здесь

Теперь разверните конечную точку оценка. Это конечная точка, на которой вам нужно сосредоточиться.

Вы увидите образец входных данных тела для PUT.

{
  "Inputs": {
    "WebServiceInput0": [
      {
        "image": "data:image/png;base64,/9j/4AAQSkZJRgA.............k=",
        "id": 134,
        "category": "dog"
      }
    ]
  },
  "GlobalParameters": {}
}

Для вас это может быть иначе, чем указано выше.

Но основная цель - отправить данные или (тело) в указанном выше формате в дополнение к передаче содержимого в байтах.

POST <ENDPOINT>/SCORE
HEADERS : Authorization Header
BODY : REQUIRED DATA IN the ABOVE MENTIONED FORMAT
person Satya V    schedule 30.11.2020