Entrené mi modelo en Amazon-SageMaker y lo descargué a mi computadora local. Desafortunadamente, no tengo idea de cómo ejecutar el modelo localmente.

El modelo está en un directorio con archivos como:

image-classification-0001.params
image-classification-0002.params
image-classification-0003.params
image-classification-0004.params
image-classification-0005.params
image-classification-symbol.json
model-shapes.json

¿Alguien sabría cómo ejecutar esto localmente con Python, o podría señalarme un recurso que podría ayudar? Estoy tratando de evitar llamar al modelo usando la API de Amazon.

Editar: El modelo que utilicé fue creado con un código muy similar a este ejemplo.

Cualquier ayuda es apreciada, otorgaré la recompensa a quien sea más útil, incluso si no resuelven por completo la pregunta.

2
walker_4 5 mar. 2018 a las 07:53

3 respuestas

La mejor respuesta

Siguiendo el consejo de SRC, pude hacerlo funcionar siguiendo las instrucciones en este pregunta y esta doc que describe cómo cargar un Modelo MXnet.

Cargué el modelo así:

lenet_model = mx.mod.Module.load('model_directory/image-classification',5)
image_l = 64
image_w = 64
lenet_model.bind(for_training=False, data_shapes=[('data',(1,3,image_l,image_w))],label_shapes=lenet_model._label_shapes)

Luego predijo el uso de las funciones auxiliares ligeramente modificadas en la documentación vinculada anteriormente:

def get_image(url, show=False):
    # download and show the image
    fname = mx.test_utils.download(url)
    img = cv2.cvtColor(cv2.imread(fname), cv2.COLOR_BGR2RGB)
    if img is None:
         return None
    if show:
         plt.imshow(img)
         plt.axis('off')
    # convert into format (batch, RGB, width, height)
    img = cv2.resize(img, (64, 64))
    img = np.swapaxes(img, 0, 2)
    img = np.swapaxes(img, 1, 2)
    img = img[np.newaxis, :]
    return img

def predict(url, labels):
    img = get_image(url, show=True)
    # compute the predict probabilities
    lenet_model.forward(Batch([mx.nd.array(img)]))
    prob = lenet_model.get_outputs()[0].asnumpy()

    # print the top-5
    prob = np.squeeze(prob)
    a = np.argsort(prob)[::-1]

    for i in a[0:5]:
       print('probability=%f, class=%s' %(prob[i], labels[i]))

Finalmente llamé a la predicción con este código:

labels = ['a','b','c', 'd','e', 'f']
predict('https://eximagesite/img_tst_a.jpg', labels )
1
walker_4 10 mar. 2018 a las 21:57

Si desea alojar su modelo entrenado localmente, y está utilizando Apache MXNet como marco de su modelo (como lo ha hecho en el ejemplo anterior), la forma más sencilla es usar MXNet Model Server: https://github.com/awslabs/mxnet-model-server

Una vez que lo instaló localmente, puede comenzar a servir usando:

mxnet-model-server \ --models squeezenet=https://s3.amazonaws.com/model-server/models/squeezenet_v1.1/squeezenet_v1.1.model

Y luego llamar al punto final local con la imagen

curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg curl -X POST http://127.0.0.1:8080/squeezenet/predict -F "data=@kitten.jpg"

0
Guy 9 mar. 2018 a las 21:43

Esta no es una respuesta completa ya que no tengo la configuración de SageMaker (y no conozco MXNet) y, por lo tanto, no puedo probar prácticamente este enfoque (sí, como ya se mencionó, no quiero llamar a esto una respuesta completa sino más bien probable puntero / enfoque para resolver este problema).

La suposición -

Usted mencionó que su modelo es muy similar al enlace del cuaderno que proporcionó. Si lees cuidadosamente el texto en el cuaderno, verás que en algún momento hay algo como esto:

"En esta demostración, estamos usando el conjunto de datos Caltech-256, que contiene 30608 imágenes de 256 objetos. Para los datos de capacitación y validación, seguimos el esquema de división en este ejemplo de MXNet".

¿Ves la mención de MXNet allí? Supongamos que no ha cambiado mucho y, por lo tanto, su modelo también está construido con MXNet.

El enfoque -

Suponiendo lo que acabo de mencionar, si va y busca en la documentación de AWS SageMaker Python SDK verá una sección sobre la serialización de los módulos. Que nuevamente, por sí mismo, comienza con otra suposición:

"Si la función de entrenamiento devuelve un objeto Módulo, será serializado por el sistema de serialización del Módulo predeterminado, a menos que haya especificado una función de guardado personalizada".

Suponiendo que esto sea cierto para su caso, la lectura adicional en el mismo documento nos dice que "model-shapes.json" es una representación serializada JSON de sus modelos, "model-symbol.json" es la serialización de los símbolos del módulo creados por llamando a la función 'guardar' en la propiedad 'símbolo' del módulo, y finalmente "module.params" es la forma serializada (no estoy seguro de si es texto o formato binario) de los parámetros del módulo.

Equipados con este conocimiento, vamos y buscamos en la documentación de MXNet. ¡Y voilá! Vemos aquí cómo podemos ahorrar y cargar modelos con MXNet. Entonces, como ya tiene esos archivos guardados, solo necesita cargarlos en una instalación local de MXNet y luego ejecutarlos para predecir lo desconocido.

Espero que esto te ayude a encontrar una dirección para resolver tu problema.

Bonus -

No estoy seguro de si esto también puede hacer el mismo trabajo (también lo menciona @Seth Rothschild en los comentarios), pero debería ver que AWS SageMaker Python SDK también tiene una forma de cargar modelos desde los guardados.

1
SRC 9 mar. 2018 a las 08:52