
30 de marzo de 2021
En este segundo artículo de la serie de dos, me sumergiré en el despliegue y el servicio de nuestros modelos a escala. Si se perdió el primero sobre el entrenamiento de un modelo fastai a escala en AI Platform Training, aquí tiene el enlace.
TL;DR
En este segundo artículo de la serie de dos, me sumergiré en el despliegue y el servicio de nuestros modelos a escala. Si se perdió el primero sobre el entrenamiento de un modelo fastai a escala en AI Platform Training, aquí tiene el enlace.
Servir un modelo de aprendizaje profundo puede revelar varios desafíos entre los cuales:
En este artículo, explicaré cómo serví un clasificador de texto de aprendizaje profundo entrenado con la biblioteca FastAI siguiendo 2 pasos principales:
Todos los materiales se encuentran en el grepositorio ithub. Este repositorio se inspiró en otro proyecto que pretendía desplegar un clasificador de imágenes fastai en AWS SageMaker Inference Endpoint aquí.
1- Despliegue del modelo fastai utilizando TorchServe
TorchServe facilita el despliegue de modelos PyTorch a escala en entornos de producción. Elimina el trabajo pesado de desarrollar su propia arquitectura cliente-servidor. La biblioteca FastAI se basa en el marco PyTorch. Hace posible utilizar esta tecnología para servir modelos fastai cargando su modelo fastai como un objeto pytorch puro (elimina la abstracción fastai).
1-1 Exportar pesos del modelo desde FastAI
Para ello, necesita restaurar el aprendiz FastAI desde el pickle de exportación del último post, y guardar sus pesos modelo con PyTorch.
from fastai.text import load_learner
from fastai.text.learner import get_c, get_text_vocab
aprender = load_learner(“fastai_cls.pkl”)
vocab_sz = len(_get_text_vocab(dls)) #dls es el cargador data que utilizó para el entrenamiento
n_clase = get_c(dls)
config = awd_lstm_clas_config.copy()
torch.save(learn.model.state_dict(), “fastai_cls_weights.pth”)
1-2 Modelo PyTorch de FastAI
Una vez que haya exportado sus ponderaciones pytorch, necesita reconstruir la estructura del modelo para poder cargar sus ponderaciones en él. Puede que tenga que escarbar un poco en el código fuente de fastai para encontrar su implementación, pero por suerte, en el cuaderno Jupyter, uno puede investigar el código fuente añadiendo ?? delante del nombre de una función.
Para el clasificador de texto, puede cargar un objeto pytorch puro utilizando la función fastai get_text_classifier
from fastai.text.all import AWD_LSTM
torch_pure_model = get_text_classifier(AWD_LSTM, vocab_sz, n_class, config=config)
1-3 Reproducir los pasos del preprocesamiento fastai
Una vez que haya obtenido su modelo pytorch puro, necesita aplicar el mismo preprocesamiento que se utilizó para el entrenamiento. FastAI dispone de un método .predict muy práctico que puede aplicarse a un texto (simple objeto de cadena), que reproduce de forma natural el preprocesamiento de entrenamiento y, por tanto, elimina el riesgo de que el entrenamiento sirva de sesgo.
pred_fastai = learn.predict(texto)
pred_fastai
>>(Categoría tensor(1), tensor(1), tensor([0,0036, 0,9964]))
En nuestro caso, tenemos que asumir esta responsabilidad nosotros mismos, ya que necesitamos deshacernos de la abstracción fastai y trabajar directamente con objetos PyTorch.
En mi ejemplo, utilicé un tokenizador spacy, por lo que reproduje el preprocesamiento fastai como se muestra a continuación:
antorcha de importación
from fastai.text.core import Tokenizer, SpacyTokenizerfrom fastai.text.data import Numericalize
ejemplo = “Hola, esto es una prueba”.”
tokenizer = Tokenizer(
tok=SpacyTokenizer(“es”)
)
numericalizador = Numericalizar(vocab=vocab)
ejemplo_procesado = numerizador(tokenizador(ejemplo))
ejemplo_procesado
>>> tensor([ 4, 7, 26, 29, 16, 72, 69, 31])
entradas = ejemplo_procesado.redimensionar(1, len(ejemplo_procesado))
salidas = modelo_torcha.forward(entradas)[0] preds = torch.softmax(salidas, dim=-1) 1TP45Puede utilizar cualquier función de activación que necesite
preds
>>> tensor([[0,0036, 0,9964]], grad_fn=)
Como puede observar, los resultados que obtengo utilizando las funciones torch y learn.predict son los mismos porque he conseguido conservar los mismos pasos de preprocesamiento.
1-4 Despliegue su modelo a través de torchserve
En esta sección desplegamos el modelo PyTorch en TorchServe. Para la instalación, consulte TorchServe Github Repository.
En general, hay principalmente 3 pasos para utilizar TorchServe:
- Archive el modelo en *.mar.
- Inicie el servicio de antorchas.
Llame a la API y obtenga la respuesta.
Para archivar el modelo, en nuestro caso se necesitan al menos 2 archivos:
- Pesos del modelo PyTorch fastai_cls_weights.pth.
- Gestor personalizado de TorchServe.
Manipulador personalizado
Como se muestra en /deployment/handler.py, el manejador TorchServe acepta data y contexto. En nuestro ejemplo, definimos otra clase Python ayudante con 4 métodos de instancia a implementar: inicializar, preprocesar, inferir y postprocesar.
Ahora está listo para configurar e iniciar TorchServe.
TorchServe en acción
Paso 1: Archivar el modelo PyTorch
--model-name=modelo_fastai
-version=1.0
-serialized-file=/home/model-server/fastai_cls_weights.pth
-- extra-files=/home/model-server/config.py,/home/model-server/vocab.json
-handler=/home/model-server/handler.py
--export-path=/home/model-server/model-store/
Paso 2: Sirva el modelo
Paso 3: Llamar a la API y obtener la respuesta (aquí utilizamos curl).
La primera llamada tendrá una latencia mayor debido a la carga de los pesos del modelo definidos en inicializar, pero esto se mitigará a partir de la segunda llamada.
2- Despliegue a la predicción de la plataforma de IA
En esta sección desplegamos el modelo entrenado por FastAI con TorchServe en la Plataforma de Predicción de IA de GCP utilizando una imagen Docker personalizada. Para más detalles sobre las rutinas de la Plataforma de Predicción de IA de GCP utilizando contenedores personalizados, consulte este artículo. Tenga en cuenta que esta opción sólo está disponible si utiliza AI Platform Prediction con endpoints regionales.
Pasos para desplegar un modelo fastai en la plataforma AI Prediction:
En primer lugar, cree un modelo de predicción de la plataforma AI en un punto final regional:
-region=REGION #eg: europe-west1
-habilitar-registro
-enable-console-logging
2-1 Construya su imagen docker que será utilizada por su versión
-repository-format=docker
-location=REGIÓN #eg: europa-oeste1
2-2 (Opcional) Compruebe que su imagen docker funciona correctamente
curl -X POST -H "Content-Type: application/json" -d '["esta era una mala película"]' 127.0.0.1:8080/predicciones/fastai_model
2-3 Empuje su imagen docker a un registro de contenedores en su proyecto GCP
Para ello necesita disponer de las credenciales IAM. Una vez que se haya asegurado de que las tiene, ejecute lo siguiente
docker push REGION-docker.pkg.dev/PROJECT_ID/ARTIFACT_REGISTRY_NAME/fastai_text_cls:v0
2-4 Cree una versión modelo utilizando su imagen Docker
-region=REGION
-model=NOMBRE_MODELO
-image=REGION-docker.pkg.dev/PROJECT_ID/ARTIFACT_REGISTRY_NAME/fastai_text_cls:v0
-puertos=8080
-health-route=/ping
-predict-route=/predicciones/fastai_model
2-5 Pruebe la versión de su modelo
-H "Autorización: Portador $(gcloud auth print-access-token)"
-H "Content-Type: application/json"
-d '["esta era una mala película"]'
https://REGION-ml.googleapis.com/v1/projects/PROJECT_ID/models/MODEL_NAME/versions/VERSION_NAME:predict
Su modelo fastai está ahora desplegado en una arquitectura sin servidor en AI Platform Prediction. Puede realizar predicciones en línea enviando solicitudes a su modelo como una API REST. Todos los métodos para solicitar predicciones se encuentran en documentación de google.
Conclusión
Utilizar la plataforma AI Prediction para servir cualquier tipo de modelo puede ser muy útil. El objetivo de este artículo era mostrar un ejemplo de un modelo de aprendizaje profundo utilizando un marco pesado (pytorch) y servirlo de forma rentable.
Hay que tener en cuenta algunas limitaciones:

BLOG






