es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error del punto de enlace Sagemaker PyTorch con los datos de entrada.

Estoy intentando enviar un payload a un endpoint de sagemaker creado de la siguiente manera:

modelo = PyTorchModel(
name="d2-sku110k-model",
model_data=training_job_artifact,
role=role,
sagemaker_session=sm_session,
entry_point="predict_sku110k.py",
source_dir="container_serving",
image_uri=serve_image_uri,
framework_version="1.6.0",
code_location=f"s3://{bucket}/{prefix_code}",

predictor = modelo.deploy(initial_instance_count=1, instance_type='ml.m5.xlarge')

He estado intentando diferentes formas de payloads como prueba, por ejemplo:

importar json
payload = json.dumps({"data": [[1,2,3]]})

o

payload = json.dumps({"data": [[1,2,3]]}).encode('utf8')

Que luego intento enviar al endpoint con:

predictor.predict(payload, initial_args={'ContentType': 'application/json'})

Pero recibo el error:

Se produjo un error (ModelError) al llamar a la operación InvokeEndpoint: Recibido error del servidor (500) desde primary con mensaje “‘utf-8’ codec can’t decode byte 0x93 in position 0: invalid start byte
Traceback (most recent call last):
File “/opt/conda/lib/python3.6/site-packages/sagemaker_inference/transformer.py”, line 124, in transform
input_data = input_data.decode(“utf-8”)

Donde este es el archivo referido en el mensaje de error.

¿Alguna idea de cómo debería formatearse el payload para esto? (tenga en cuenta que [[1,2,3]] es solo un ejemplo, el payload real será una imagen)

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que hay un problema con la codificación de la carga. El mensaje de error sugiere que la entrada está en un formato diferente al esperado, por lo que podría ser necesario modificar los datos de entrada para que coincidan con el formato esperado.

    Para enviar una imagen al punto final, una manera de dar formato a la carga es utilizando la biblioteca boto3 para leer el archivo de imagen y convertirlo en bytes:

    import boto3
    
    # leer archivo de imagen
    with open('image.jpg', 'rb') as f:
        image = f.read()
    
    # codificar imagen como bytes
    payload = bytearray(image)
    

    Luego, la carga se puede enviar al punto final con:

    predictor.predict(payload, initial_args={'Content-type': 'application/x-image'})
    

    Tenga en cuenta que la cabecera Content-type se establece en application/x-image para indicar que la carga es una imagen.

    Alternativamente, si la imagen ya está cargada como una matriz numpy o una imagen PIL, se puede convertir en bytes con:

    import io
    import numpy as np
    from PIL import Image
    
    # cargar imagen
    image = Image.open('image.jpg')
    
    # convertir imagen en bytes
    buffer = io.BytesIO()
    image.save(buffer, format='JPEG')
    payload = buffer.getvalue()
    

    Luego, la carga se puede enviar al punto final como antes.

Comments are closed.