Compartir a través de


Uso de un contenedor personalizado para implementar un modelo en un punto de conexión en línea

SE APLICA A:Extensión ML de la CLI de Azure v2 (actual)SDK de Python azure-ai-ml v2 (actual)

En Azure Machine Learning, puede usar un contenedor personalizado para implementar un modelo en un punto de conexión en línea. Las implementaciones de contenedores personalizadas pueden usar servidores web distintos del servidor predeterminado de Python Flask que usa Azure Machine Learning.

Al usar una implementación personalizada, puede hacer lo siguiente:

  • Use varias herramientas y tecnologías, como TensorFlow Serving (TF Serving), TorchServe, Triton Inference Server, el paquete Plumber R y la imagen mínima de inferencia de Azure Machine Learning.
  • Aún así, aproveche las ventajas de la supervisión, el escalado, las alertas y la autenticación integrados que ofrece Azure Machine Learning.

En este artículo se muestra cómo usar una imagen de servicio de TF para servir un modelo de TensorFlow.

Requisitos previos

  • Un grupo de recursos de Azure que contiene tu espacio de trabajo y al que tú o tu entidad de servicio tenéis acceso como Colaborador. Si usa los pasos descritos en Creación del área de trabajo para configurar el área de trabajo, cumple este requisito.

  • Motor de Docker, instalado y ejecutándose localmente. Este requisito previo es muy recomendable. Necesita implementar un modelo localmente y resulta útil para la depuración.

Ejemplos de implementación

En la tabla siguiente se enumeran los ejemplos de implementación que usan contenedores personalizados y aprovechan las distintas herramientas y tecnologías.

Ejemplo Script de la CLI de Azure Descripción
minimal/multimodel deploy-custom-container-minimal-multimodel Implementa varios modelos en una sola implementación mediante la extensión de la imagen mínima de inferencia de Azure Machine Learning.
minimal/single-model deploy-custom-container-minimal-single-model Implementa un único modelo mediante la extensión de la imagen mínima de inferencia de Azure Machine Learning.
mlflow/multideployment-scikit deploy-custom-container-mlflow-multideployment-scikit Implementa dos modelos de MLFlow con distintos requisitos de Python en dos implementaciones independientes detrás de un único punto de conexión. Usa la imagen mínima de inferencia de Azure Machine Learning.
r/multimodel-plumber deploy-custom-container-r-multimodel-plumber Implementa tres modelos de regresión en un punto de conexión. Usa el paquete Plumber R.
tfserving/half-plus-two deploy-custom-container-tfserving-half-plus-two Implementa un modelo Half Plus Two mediante un contenedor personalizado tf Serving. Usa el proceso de registro de modelos estándar.
tfserving/half-plus-two-integrated deploy-custom-container-tfserving-half-plus-two-integrated Implementa un modelo Half Plus Two mediante un contenedor personalizado tf Serving con el modelo integrado en la imagen.
torchserve/densenet deploy-custom-container-torchserve-densenet Implementa un único modelo mediante un contenedor personalizado de TorchServe.
triton/single-model deploy-custom-container-triton-single-model Implementa un modelo de Triton mediante un contenedor personalizado.

En este artículo se muestra cómo usar el ejemplo tfserving/half-plus-two.

Advertencia

Es posible que los equipos de soporte técnico de Microsoft no puedan ayudar a solucionar problemas causados por una imagen personalizada. Si tiene problemas, es posible que se le pida que use la imagen predeterminada o una de las imágenes que Proporciona Microsoft para ver si el problema es específico de la imagen.

Descarga del código fuente

Los pasos de este artículo usan ejemplos de código del repositorio azureml-examples . Use los comandos siguientes para clonar el repositorio:

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

Inicialización de las variables de entorno

Para usar un modelo de TensorFlow, necesita varias variables de entorno. Ejecute los siguientes comandos para definir esas variables:

BASE_PATH=endpoints/online/custom-container/tfserving/half-plus-two
AML_MODEL_NAME=tfserving-mounted
MODEL_NAME=half_plus_two
MODEL_BASE_PATH=/var/azureml-app/azureml-models/$AML_MODEL_NAME/1

Descarga de un modelo de TensorFlow

Descargue y descomprima un modelo que divide un valor de entrada por dos y agrega dos al resultado:

wget https://aka.ms/half_plus_two-model -O $BASE_PATH/half_plus_two.tar.gz
tar -xvf $BASE_PATH/half_plus_two.tar.gz -C $BASE_PATH

Prueba una imagen de TF Serving localmente

Use Docker para ejecutar la imagen localmente para realizar pruebas:

docker run --rm -d -v $PWD/$BASE_PATH:$MODEL_BASE_PATH -p 8501:8501 \
 -e MODEL_BASE_PATH=$MODEL_BASE_PATH -e MODEL_NAME=$MODEL_NAME \
 --name="tfserving-test" docker.io/tensorflow/serving:latest
sleep 10

Envío de solicitudes de ejecución y puntuación a la imagen

Envíe una solicitud de ejecución para comprobar que el proceso dentro del contenedor se está ejecutando. Debería obtener un código de estado de respuesta de 200 OK.

curl -v http://localhost:8501/v1/models/$MODEL_NAME

Envíe una solicitud de puntuación para comprobar que puede obtener predicciones sobre datos sin etiquetar:

curl --header "Content-Type: application/json" \
  --request POST \
  --data @$BASE_PATH/sample_request.json \
  http://localhost:8501/v1/models/$MODEL_NAME:predict

Detención de la imagen

Cuando termine de probar localmente, detenga la imagen:

docker stop tfserving-test

Implementación del punto de conexión en línea en Azure

Para implementar el punto de conexión en línea en Azure, siga los pasos descritos en las secciones siguientes.

Creación de archivos YAML para el punto de conexión y la implementación

Puede configurar la implementación en la nube mediante YAML. Por ejemplo, para configurar el punto de conexión, puede crear un archivo YAML denominado tfserving-endpoint.yml que contenga las siguientes líneas:

$schema: https://azuremlsdk2.blob.core.windows.net/latest/managedOnlineEndpoint.schema.json
name: tfserving-endpoint
auth_mode: aml_token

Para configurar la implementación, puede crear un archivo YAML denominado tfserving-deployment.yml que contenga las siguientes líneas:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: tfserving-deployment
endpoint_name: tfserving-endpoint
model:
  name: tfserving-mounted
  version: <model-version>
  path: ./half_plus_two
environment_variables:
  MODEL_BASE_PATH: /var/azureml-app/azureml-models/tfserving-mounted/<model-version>
  MODEL_NAME: half_plus_two
environment:
  #name: tfserving
  #version: 1
  image: docker.io/tensorflow/serving:latest
  inference_config:
    liveness_route:
      port: 8501
      path: /v1/models/half_plus_two
    readiness_route:
      port: 8501
      path: /v1/models/half_plus_two
    scoring_route:
      port: 8501
      path: /v1/models/half_plus_two:predict
instance_type: Standard_DS3_v2
instance_count: 1

En las secciones siguientes se describen conceptos importantes sobre los parámetros de YAML y Python.

Imagen base

En la environment sección de YAML o el Environment constructor de Python, especifique la imagen base como parámetro. En este ejemplo se usa docker.io/tensorflow/serving:latest como valor de image.

Si inspecciona el contenedor, puede ver que este servidor usa ENTRYPOINT comandos para iniciar un script de punto de entrada. Ese script toma variables de entorno como MODEL_BASE_PATH y MODEL_NAME, y expone puertos como 8501. Estos detalles pertenecen a este servidor y puede usar esta información para determinar cómo definir la implementación. Por ejemplo, si establece las variables de entorno MODEL_BASE_PATH y MODEL_NAME en la definición de implementación, TF Serving usa esos valores para iniciar el servidor. Del mismo modo, si establece el puerto para cada ruta en 8501 en la definición de implementación, las solicitudes de usuario a esas rutas se enrutan correctamente al servidor TF Serving.

Este ejemplo se basa en el caso tf Serving. Sin embargo, puede usar cualquier contenedor que permanezca funcionando y responda a las solicitudes que van a las rutas de disponibilidad, preparación y puntuación. Para ver cómo formar un Dockerfile para crear un contenedor, puede consultar otros ejemplos. Algunos servidores usan CMD instrucciones en lugar de ENTRYPOINT instrucciones.

Parámetro de configuración de inferencia

En la environment sección o la Environment clase , inference_config es un parámetro . Especifica el puerto y la ruta de acceso para tres tipos de rutas: disponibilidad, preparación y puntuación. El inference_config parámetro es necesario si desea ejecutar su propio contenedor con un punto de conexión en línea administrado.

Rutas de preparación frente a rutas de ejecución

Algunos servidores de API proporcionan una manera de comprobar el estado del servidor. Hay dos tipos de rutas que puede especificar para comprobar el estado:

  • Rutas de ejecución : para comprobar si un servidor se está ejecutando, se usa una ruta de ejecución.
  • Rutas de preparación : para comprobar si un servidor está listo para funcionar, use una ruta de preparación.

En el contexto de la inferencia de aprendizaje automático, un servidor puede responder con un código de estado 200 Ok a una solicitud de ejecución antes de cargar un modelo. El servidor puede responder con un código de estado 200 OK a una solicitud de disponibilidad solo después de cargar el modelo en memoria.

Para obtener más información sobre los sondeos de estado activo y preparación, consulte Configurar sondeos de estado activo, preparación y inicio.

El servidor de API que elija determina las rutas de ejecución y preparación. Identifica ese servidor en un paso anterior al probar el contenedor localmente. En este artículo, la implementación de ejemplo usa la misma ruta de acceso para las rutas de ejecución y preparación, ya que TF Serving solo define una ruta de ejecución. Para ver otras formas de definir las rutas, consulte otros ejemplos.

Rutas de puntuación

El servidor de API que usa proporciona una manera de recibir la carga útil en la que trabajar. En el contexto de la inferencia de aprendizaje automático, un servidor recibe los datos de entrada a través de una ruta específica. Identifique esa ruta para el servidor de API al probar el contenedor localmente en un paso anterior. Especifique esa ruta como ruta de puntuación al definir la implementación que se va a crear.

La exitosa creación de la implementación también actualiza el parámetro scoring_uri del punto de conexión. Para comprobar este hecho, ejecute el siguiente comando: az ml online-endpoint show -n <endpoint-name> --query scoring_uri.

Buscar el modelo montado

Al implementar un modelo como un punto de conexión en línea, Azure Machine Learning monta el modelo en el punto de conexión. Cuando se monta el modelo, puede implementar nuevas versiones del modelo sin tener que crear una nueva imagen de Docker. De forma predeterminada, un modelo registrado con el nombre my-model y la versión 1 se encuentra en la siguiente ruta de acceso dentro del contenedor implementado: /var/azureml-app/azureml-models/my-model/1.

Por ejemplo, considere la siguiente configuración:

  • Estructura de directorios en la máquina local de /azureml-examples/cli/endpoints/online/custom-container
  • Nombre de modelo de half_plus_two

Captura de pantalla que muestra una vista de árbol de una estructura de directorios local. La ruta de acceso /azureml-examples/cli/endpoints/online/custom-container está visible.

Supongamos que el archivo tfserving-deployment.yml contiene las siguientes líneas en su model sección. En esta sección, el name valor hace referencia al nombre que se usa para registrar el modelo en Azure Machine Learning.

model:
    name: tfserving-mounted
    version: 1
    path: ./half_plus_two

En este caso, al crear una implementación, el modelo se encuentra en la carpeta siguiente: /var/azureml-app/azureml-models/tfserving-mounted/1.

Captura de pantalla que muestra una vista de árbol de la estructura del directorio de implementación. La ruta de acceso var/azureml-app/azureml-models/tfserving-mounted/1 está visible.

Puede configurar opcionalmente el valor model_mount_path. Al ajustar esta configuración, puede cambiar la ruta de acceso donde se monta el modelo.

Importante

El model_mount_path valor debe ser una ruta de acceso absoluta válida en Linux (el sistema operativo de la imagen de contenedor).

Al cambiar el valor de model_mount_path, también debe actualizar la variable de entorno MODEL_BASE_PATH. Ajuste MODEL_BASE_PATH al mismo valor que model_mount_path para evitar una implementación fallida debido a un error relacionado con la ruta de acceso base que no se ha encontrado.

Por ejemplo, puede agregar el model_mount_path parámetro al archivo tfserving-deployment.yml. También puede actualizar el valor MODEL_BASE_PATH en ese archivo.

name: tfserving-deployment
endpoint_name: tfserving-endpoint
model:
  name: tfserving-mounted
  version: 1
  path: ./half_plus_two
model_mount_path: /var/tfserving-model-mount
environment_variables:
  MODEL_BASE_PATH: /var/tfserving-model-mount
...

En la implementación, el modelo se encuentra en /var/tfserving-model-mount/tfserving-mounted/1. Ya no está en azureml-app/azureml-models, sino en la ruta de acceso de montaje que ha especificado:

Captura de pantalla que muestra una vista de árbol de la estructura del directorio de implementación. La ruta de acceso /var/tfserving-model-mount/tfserving-mounted/1 está visible.

Creación del punto de conexión y la implementación

Después de construir el archivo YAML, use el siguiente comando para crear el punto de conexión:

az ml online-endpoint create --name tfserving-endpoint -f endpoints/online/custom-container/tfserving/half-plus-two/tfserving-endpoint.yml

Use el comando siguiente para crear la implementación. Este paso puede ejecutarse durante unos minutos.

az ml online-deployment create --name tfserving-deployment -f endpoints/online/custom-container/tfserving/half-plus-two/tfserving-deployment.yml --all-traffic

Invocación del punto de conexión

Una vez completada la implementación, realice una solicitud de puntuación al punto de conexión implementado.

RESPONSE=$(az ml online-endpoint invoke -n $ENDPOINT_NAME --request-file $BASE_PATH/sample_request.json)

Eliminación del punto de conexión

Si ya no necesita el punto de conexión, ejecute el siguiente comando para eliminarlo:

az ml online-endpoint delete --name tfserving-endpoint