Sagemaker Predict для локального экземпляра, ошибка JSON - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь сделать метод обучения передачи в MXNet на экземпляре Sagemaker.Обучайтесь и обслуживайте старт локально без каких-либо проблем, и я использую этот код Python для прогнозирования:

def predict_mx(net, fname):
    with open(fname, 'rb') as f:
      img = image.imdecode(f.read())
      plt.imshow(img.asnumpy())
      plt.show()
    data = transform(img, -1, test_augs)
    plt.imshow(data.transpose((1,2,0)).asnumpy()/255)
    plt.show()
    data = data.expand_dims(axis=0)
    return net.predict(data.asnumpy().tolist())

Я проверил data.asnumpy().tolist(), что в порядке, и Pyplot рисует изображения (первый - исходное изображение, второе -измененное изображение).Но net.predict выдает ошибку:

---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-171-ea0f1f5bdc72> in <module>()
----> 1 predict_mx(predictor.predict, './data2/burgers-imgnet/00103785.jpg')

<ipython-input-170-150a72b14997> in predict_mx(net, fname)
     30     plt.show()
     31     data = data.expand_dims(axis=0)
---> 32     return net(data.asnumpy().tolist())
     33 

~/Projects/Lab/ML/AWS/v/lib64/python3.6/site-packages/sagemaker/predictor.py in predict(self, data)
     89         if self.deserializer is not None:
     90             # It's the deserializer's responsibility to close the stream
---> 91             return self.deserializer(response_body, response['ContentType'])
     92         data = response_body.read()
     93         response_body.close()

~/Projects/Lab/ML/AWS/v/lib64/python3.6/site-packages/sagemaker/predictor.py in __call__(self, stream, content_type)
    290         """
    291         try:
--> 292             return json.load(codecs.getreader('utf-8')(stream))
    293         finally:
    294             stream.close()

/usr/lib64/python3.6/json/__init__.py in load(fp, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    297         cls=cls, object_hook=object_hook,
    298         parse_float=parse_float, parse_int=parse_int,
--> 299         parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
    300 
    301 

/usr/lib64/python3.6/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    352             parse_int is None and parse_float is None and
    353             parse_constant is None and object_pairs_hook is None and not kw):
--> 354         return _default_decoder.decode(s)
    355     if cls is None:
    356         cls = JSONDecoder

/usr/lib64/python3.6/json/decoder.py in decode(self, s, _w)
    337 
    338         """
--> 339         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    340         end = _w(s, end).end()
    341         if end != len(s):

/usr/lib64/python3.6/json/decoder.py in raw_decode(self, s, idx)
    355             obj, end = self.scan_once(s, idx)
    356         except StopIteration as err:
--> 357             raise JSONDecodeError("Expecting value", s, err.value) from None
    358         return obj, end

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Я пытался json.dumps мои данные, и с этим нет проблем.

Обратите внимание, что я не развернул службу наAWS пока, я хочу иметь возможность проверить модель и прогноз на местном уровне, прежде чем сделать поезд большего размера и обслуживать его позже.

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 14 июля 2018

Звонок на net.predict работает нормально.

Похоже, что вы используете SageMaker Python SDK Forex_FN для хостинга.После того, как Forex_FN будет вызван, контейнер MXNet попытается сериализовать ваш прогноз в JSON, прежде чем отправить его обратно клиенту.Вы можете увидеть код, который делает это здесь: https://github.com/aws/sagemaker-mxnet-container/blob/master/src/mxnet_container/serve/transformer.py#L132

Контейнеру не удается сериализоваться, потому что net.predict не возвращает сериализуемый объект.Вы можете решить эту проблему, вернув вместо этого список:

return net.predict(data.asnumpy().tolist()).asnumpy().tolist()

Другой альтернативой является использование transform_fn вместо вестиция_fn , чтобы вы могли обрабатывать выходную сериализацию самостоятельно,Вы можете увидеть пример transform_fn здесь https://github.com/aws/sagemaker-python-sdk/blob/e93eff66626c0ab1f292048451c4c3ac7c39a121/examples/cli/host/script.py#L41

0 голосов
/ 10 июля 2018

У вас есть проблема с десериализацией данных, которые передаются из записной книжки в среду прогнозирования (в докере), но я не смог воспроизвести это, учитывая предоставленный код.При использовании оценщика MXNet (например, from sagemaker.mxnet import MXNet) вы можете реализовать transform_fn в сценарии точки входа, чтобы десериализовать данные и сделать прогноз с помощью модели.Используйте json.loads в начале функции, как в примере ниже;

def transform_fn(net, data, input_content_type, output_content_type):
    """
    Transform a request using the Gluon model. Called once per request.
    :param net: The Gluon model.
    :param data: The request payload.
    :param input_content_type: The request content type.
    :param output_content_type: The (desired) response content type.
    :return: response payload and content type.
    """
    # we can use content types to vary input/output handling, but
    # here we just assume json for both
    parsed = json.loads(data)
    nda = mx.nd.array(parsed)
    output = net(nda)
    prediction = mx.nd.argmax(output, axis=1)
    response_body = json.dumps(prediction.asnumpy().tolist()[0])
    return response_body, output_content_type

Вам следует проверить значение data, если у вас все еще есть проблемы с командой json.loads, ивнимательно изучите проблемы, связанные с кодировками (т. е. строка, начинающаяся с \, которая не будет действительной).

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

...