Compartir vía


Tutorial: Aplicación de modelos de aprendizaje automático en Azure Functions con Python y TensorFlow

En este artículo, aprenderá a usar Python, TensorFlow y Azure Functions con un modelo de aprendizaje automático para clasificar una imagen en función de su contenido. Como todo el trabajo se realiza localmente y no se crean recursos de Azure en la nube, completar este tutorial no conlleva ningún costo.

  • Inicialice un entorno local para el desarrollo de Azure Functions en Python.
  • Importe un modelo de aprendizaje automático de TensorFlow personalizado en una aplicación de funciones.
  • Cree una API HTTP sin servidor para clasificar una imagen que contenga un perro o un gato.
  • Utilice la API desde una aplicación web.

Prerrequisitos

Comprobación de requisitos previos

  1. En una ventana de terminal o de comandos, ejecute func --version para comprobar que la versión de Azure Functions Core Tools es 2.7.1846 u otra posterior.
  2. Ejecute python --version (Linux/MacOS) o py --version (Windows) para comprobar los informes de la versión de Python 3.7.x.

Clonación del repositorio de tutoriales

  1. En una ventana de terminal o de comandos, clone el siguiente repositorio mediante Git:

    git clone https://github.com/Azure-Samples/functions-python-tensorflow-tutorial.git
    
  2. Vaya a la carpeta y examine su contenido.

    cd functions-python-tensorflow-tutorial
    
    • start es la carpeta de trabajo del tutorial.
    • end es el resultado final y la implementación completa como referencia.
    • resources contiene el modelo de aprendizaje automático y las bibliotecas auxiliares.
    • frontend es un sitio web que llama a la aplicación de funciones.

Creación y activación de un entorno virtual de Python

Vaya a la carpeta start y ejecute los siguientes comandos para crear y activar un entorno virtual llamado .venv. Asegúrese de usar Python 3.7, que es compatible con Azure Functions.

cd start
python -m venv .venv
source .venv/bin/activate

Si Python no instaló el paquete venv en la distribución de Linux, ejecute el siguiente comando:

sudo apt-get install python3-venv

Ejecute todos los comandos siguientes en este entorno virtual activado. (Para salir del entorno virtual, ejecute deactivate).

Creación de un proyecto local de Functions

En Azure Functions, un proyecto de función es un contenedor para una o varias funciones individuales que responden a un desencadenador específico. Todas las funciones de un proyecto comparten las mismas configuraciones locales y de hospedaje. En esta sección, creará un proyecto de función que contiene una sola función reutilizable llamada classify, que proporciona un punto de conexión HTTP. Agregará código más específico en una sección posterior.

  1. En la carpeta start, use Azure Functions Core Tools para inicializar una aplicación de funciones de Python:

    func init --worker-runtime python
    

    Después de la inicialización, la carpeta start contiene varios archivos del proyecto, incluidos los archivos de configuración local.settings.json y host.json. Como local.settings.json puede contener secretos descargados de Azure, el archivo se excluye del control de código fuente de forma predeterminada en el archivo .gitignore.

    Sugerencia

    Como un proyecto de función está asociado a un entorno de ejecución específico, todas las funciones del proyecto deben estar escritas con el mismo lenguaje.

  2. Agregue una función al proyecto mediante el comando siguiente, donde el argumento --name es el nombre único de la función y el argumento --template especifica el desencadenador de esta. func new crea una subcarpeta que coincide con el nombre de la función y que contiene un archivo de código apropiado para el lenguaje elegido del proyecto y un archivo de configuración denominado function.json.

    func new --name classify --template "HTTP trigger"
    

    Este comando crea una carpeta que coincide con el nombre de la función classify. En esa carpeta hay dos archivos: __init__.py, que contiene el código de la función, y function.json, que describe el desencadenador de la función y sus enlaces de entrada y salida. Para más información sobre el contenido de estos archivos, consulte Modelo de programación en la guía para desarrolladores de Python.

Ejecución local de la función

  1. Inicie la función, iniciando para ello el host del entorno de ejecución de Azure Functions local en la carpeta start:

    func start
    
  2. Cuando vea que el punto de conexión classify aparece en la salida, vaya a la dirección URL http://localhost:7071/api/classify?name=Azure. El mensaje "Hello Azure!" debe aparecer en la salida.

  3. Use Ctrl-C para detener el host.

Importación del modelo de TensorFlow y adición del código auxiliar

Para modificar la función classify para clasificar una imagen en función de su contenido, se usa un modelo de TensorFlow predefinido que se ha entrenado y se ha exportado desde Azure Custom Vision Service. El modelo, que se encuentra en la carpeta resources del ejemplo clonado anteriormente, clasifica una imagen en función de si contiene un perro o un gato. A continuación, agregue el código auxiliar y las dependencias al proyecto.

Para crear su propio modelo con el nivel gratuito de Custom Vision Service, siga las instrucciones del repositorio del proyecto de ejemplo.

Sugerencia

Si desea hospedar el modelo de TensorFlow de modo independiente respecto de la aplicación de función, puede montar un recurso compartido de archivos que contenga el modelo en la aplicación de funciones de Linux. Para más información, consulte Montaje de un recurso compartido de archivos en una aplicación de funciones de Python mediante la CLI de Azure.

  1. En la carpeta start, ejecute el siguiente comando para copiar los archivos del modelo en la carpeta classify. Asegúrese de incluir \* en el comando.

    cp ../resources/model/* classify
    
  2. Compruebe que la carpeta classify contiene los archivos llamados model.pb y labels.txt. Si no es así, compruebe que ejecutó el comando en la carpeta start.

  3. En la carpeta start, ejecute el siguiente comando para copiar un archivo con el código auxiliar en la carpeta classify:

    cp ../resources/predict.py classify
    
  4. Compruebe que la carpeta classify contiene ahora un archivo llamado predict.py.

  5. Abra start/requirements.txt en un editor de texto y agregue las siguientes dependencias requeridas por el código auxiliar:

    tensorflow==1.14
    Pillow
    requests
    
  6. Guarde requirements.txt.

  7. Ejecute el siguiente comando en la carpeta start para instalar las dependencias. La instalación puede tardar unos minutos. Durante este tiempo, puede continuar modificando la función en la sección siguiente.

    pip install --no-cache-dir -r requirements.txt
    

    En Windows, quizás se produzca el error "No se pudieron instalar los paquetes debido a un error de entorno: [Errno 2]. No existe tal archivo o directorio:", seguido de una ruta de acceso larga a un archivo como sharded_mutable_dense_hashtable.cpython-37.pyc. Normalmente, este error se produce porque la ruta de acceso de la carpeta es demasiado larga. En este caso, establezca la clave del Registro HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled en 1 para habilitar rutas de acceso largas. Como alternativa, compruebe dónde está instalado el intérprete de Python. Si esa ubicación tiene una ruta de acceso larga, intente volver a instalarlo en una carpeta con una ruta de acceso más corta.

Sugerencia

Cuando se llama a predict.py para realizar la primera predicción, una función llamada _initialize carga el modelo de TensorFlow desde el disco y lo almacena en memoria caché, en variables globales. Este almacenamiento en caché acelera las predicciones posteriores. Para más información sobre el uso de variables globales, consulte la guía de Azure Functions para desarrolladores de Python.

Actualización de la función para ejecutar predicciones

  1. Abra classify/__init__.py en un editor de texto y agregue las siguientes líneas después de las instrucciones import existentes para importar la biblioteca JSON estándar y las aplicaciones auxiliares de tipo predict:

    import logging
    import azure.functions as func
    import json
    
    # Import helper script
    from .predict import predict_image_from_url
    
  2. Reemplace todo el contenido de la función main por el código siguiente:

    def main(req: func.HttpRequest) -> func.HttpResponse:
        image_url = req.params.get('img')
        logging.info('Image URL received: ' + image_url)
    
        results = predict_image_from_url(image_url)
    
        headers = {
            "Content-type": "application/json",
            "Access-Control-Allow-Origin": "*"
        }
    
        return func.HttpResponse(json.dumps(results), headers = headers)
    

    Esta función recibe una dirección URL de imagen en un parámetro de cadena de consulta denominado img. A continuación, llama a predict_image_from_url desde la biblioteca auxiliar para descargar y clasificar la imagen mediante el modelo de TensorFlow. A continuación, la función devuelve una respuesta HTTP con los resultados.

    Importante

    Como una página web hospedada en otro dominio llama a este punto de conexión HTTP, la respuesta incluye un encabezado Access-Control-Allow-Origin para satisfacer los requisitos de uso compartido de recursos entre orígenes (CORS) del explorador.

    En una aplicación de producción, cambie * al origen específico de la página web para mayor seguridad.

  3. Guarde los cambios y, si las dependencias han terminado de instalarse, vuelva a iniciar el host de la función local con func start. Asegúrese de ejecutar el host en la carpeta start con el entorno virtual activado. De lo contrario, se iniciará el host, pero verá errores al invocar la función.

    func start
    
  4. En un explorador, abra la siguiente dirección URL para invocar la función con la dirección URL de una imagen de gato y confirmar que el código JSON devuelto clasifica la imagen como un gato.

    http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat1.png
    
  5. Mantenga el host en ejecución porque lo usará en el paso siguiente.

Ejecución del front-end de la aplicación web local para probar la función

Para probar la invocación del punto de conexión de la función desde otra aplicación web, hay una aplicación simple en la carpeta frontend del repositorio.

  1. Abra un nuevo terminal o símbolo del sistema y active el entorno virtual (tal y como se describió anteriormente en Creación y activación de un entorno virtual de Python).

  2. Vaya a la carpeta frontend del repositorio.

  3. Inicie un servidor HTTP con Python:

    python -m http.server
    
  4. En un explorador, vaya a localhost:8000, escriba una de las siguientes direcciones URL de foto en el cuadro de texto o use la dirección URL de cualquier imagen accesible públicamente.

    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat1.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat2.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/dog1.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/dog2.png
  5. Seleccione Submit para invocar el punto de conexión de función para clasificar la imagen.

    Captura de pantalla del proyecto terminado

    Si el explorador informa de un error al enviar la dirección URL de la imagen, compruebe el terminal en el que está ejecutando la aplicación de funciones. Si ve un error similar a "No se encontró ningún módulo PIL", es posible que haya iniciado la aplicación de funciones en la carpeta start sin activar primero el entorno virtual que creó anteriormente. Si sigue viendo errores, ejecute de nuevo pip install -r requirements.txt con el entorno virtual activado y busque errores.

Nota

El modelo siempre clasifica el contenido de la imagen como un gato o un perro, con independencia de si la imagen contiene alguno. El valor predeterminado es perro. Las imágenes de tigres y panteras, por ejemplo, normalmente se clasifican como gato, pero las imágenes de elefantes, zanahorias o aviones se clasifican como perro.

Limpieza de recursos

La totalidad de este tutorial se ejecuta localmente en la máquina, por lo que no hay que limpiar ningún recurso o servicio de Azure.

Pasos siguientes

En este tutorial aprendió a crear y personalizar un punto de conexión de API HTTP con Azure Functions para clasificar mediante un modelo de TensorFlow. También ha aprendido a llamar a la API desde una aplicación web. Puede utilizar estas técnicas del tutorial para crear API de cualquier complejidad, todo ello mientras ejecuta el modelo de proceso sin servidor proporcionado por Azure Functions.

Consulte también: