Compartir a través de


Tutorial: Aplicación de modelos de Machine Learning 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. Dado que todo funciona localmente y no crea ningún recurso Azure en la nube, no hay ningún costo para completar este tutorial.

  • Inicialice un entorno local para desarrollar 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 comando, ejecute func --version para comprobar que Azure Functions Core Tools son la versión 2.7.1846 o posterior.
  2. Ejecute python --version (Linux/macOS) o py --version (Windows) para comprobar que la versión de Python es 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.
    • El frontend es un sitio web que invoca 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 . Asegúrese de usar Python 3.7, que es compatible con Azure Functions.

  • bash
  • PowerShell
  • Cmd
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 ).

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 cada una responde a un desencadenador específico. Todas las funciones de un proyecto comparten las mismas configuraciones locales y de hospedaje. En esta sección, crearás un proyecto de función que contiene una sola función de plantilla llamada [Nombre de la función], la cual proporciona un punto de conexión HTTP. Agregas 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. Dado que 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 es el nombre único de la función y el argumento especifica el desencadenador de esta. 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 obtener más información sobre el contenido de estos archivos, consulte Programming model en la guía para desarrolladores de Python.

Ejecución local de la función

  1. Inicie la función iniciando el host en tiempo de ejecución de Azure Functions local en la carpeta start:

    func start
    
  2. Una vez que vea el endpoint classify aparecer 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 CtrlC para detener el host.

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

Proposed Improvements: Para modificar la función classify para clasificar una imagen en función de su contenido, use un modelo TensorFlow pregenerado que se haya entrenado y exportado desde el servicio Azure Custom Vision. 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 compilar su propio modelo con el nivel gratuito de Custom Vision Service, siga las instrucciones del repositorio de proyectos sample.

Sugerencia

Si desea hospedar el modelo de TensorFlow independientemente de la aplicación de funciones, puede montar una compartición de archivos que contenga el modelo en la aplicación de funciones de Linux. Para más información, consulte Montaje de recursos compartidos de archivos.

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

    • bash
    • PowerShell
    • Cmd
    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:

    • bash
    • PowerShell
    • Cmd
    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 el archivo 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, es posible que encuentre el error "No se pudieron instalar paquetes debido a un EnvironmentError: [Errno 2] No existe tal archivo o directorio:" seguido de un nombre de ruta de acceso largo 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 a un valor específico para permitir rutas extensas. 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 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.

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 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 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 . A continuación, hace una llamada 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 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 . Asegúrese de ejecutar el host en la carpeta start con el entorno virtual activado. De lo contrario, el servidor se iniciará, pero se mostrarán 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 (como se ha descrito anteriormente en Crear y activar un entorno virtual de Python).

  2. Vaya a la carpeta frontend del repositorio.

  3. Inicie un servidor HTTP con Python:

    • bash
    • PowerShell
    • Cmd
    python -m http.server
    
  4. En un explorador, vaya a , 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 Enviar para invocar el punto final de la 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 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

Dado que la totalidad de este tutorial se ejecuta localmente en su equipo, no hay recursos ni servicios de Azure que necesiten eliminarse.

Pasos siguientes

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

Consulte también: