Digital Developer Conference: Hybrid Cloud - Aprende a crear apps inteligentes y seguras en una nube híbrida: ágil, flexible y portable. 22-Set Inscríbete Ahora

Aproveche el deep learning en IBM Cloud Functions

IBM Cloud Functions, que se basa en Apache OpenWhisk, es una plataforma de Funciones como un Servicio (FaaS) que facilita la creación y el despliegue de aplicaciones sin servidor.

En este tutorial, usted creará una aplicación sin servidor utilizando IBM Cloud Functions que monitorea el contenido de un sector de almacenamiento de Cloud Object Storage y analiza el contenido de las imágenes que una persona o proceso automatizado suben al sector en cuestión. Para fines ilustrativos, el análisis es realizado desde Model Asset eXchange por un microservicio de deep learning, y los resultados del análisis se almacenan como archivos JSON en el mismo sector de almacenamiento.

escenario del tutorial

Es posible adaptar fácilmente el enfoque descrito para aprovechar los servicios cognitivos hospedados, como los proporcionados por IBM Watson®, y almacenar los resultados en un almacén de datos NoSQL como Cloudant® o en una base de datos relacional.

Objetivos de aprendizaje

Si realiza este tutorial introductorio, aprenderá cómo monitorear un sector de almacenamiento de Cloud Object Storage para encontrar cambios (objetos nuevos, actualizados o borrados) mediante Cloud Functions y cómo usar los microservicios de deep learning de Model Asset eXchange para analizar automáticamente esos objetos casi en tiempo real.

Cuando finalice el tutorial, sabrá cómo utilizar IBM Cloud CLI para configurar el monitoreo de cambios para un sector de almacenamiento de Cloud Object Storage, y cómo utilizar microservicios de deep learning para derivar información de los objetos subidos, como archivos de imágenes, audio, video o texto, casi en tiempo real.

Requisitos Previos

Para seguir este tutorial, debe tener lo siguiente:

  • Una cuenta de IBM Cloud.
  • Acceso de administrador a una instancia de Cloud Object Storage. (Es posible seguir este tutorial con instancias de los planes Lite y Standard). Las instrucciones del tutorial se refieren a una instancia llamada «cloud-object-storage-lite». Cuando sea necesario, reemplace ese nombre por el de su instancia de Cloud Object Storage.
  • Tener instalada la versión 0.19 o superior de IBM Cloud CLI. Consulte estas instrucciones sobre cómo saber qué versión tiene instalada y cómo actualizarla.
  • Tener instalada la versión 1.0.34 o superior del plug-in IBM Cloud Functions.

Si usted nunca usó Cloud Functions, revise los conceptos brevemente antes de continuar.

Descargue los artefactos del tutorial de GitHub

Si usted tiene instalado un cliente de GitHub en su máquina local, clone el repositorio del tutorial:

git clone https://github.com/IBM/use-deep-learning-in-ibm-cloud-functions
cd use-deep-learning-in-ibm-cloud-functions

Si usted no tiene instalado un cliente de GitHub, descargue el archivo ZIP y extráigalo.

Tiempo estimado

Para completar este tutorial hacen falta aproximadamente 30 minutos.

Pasos

Para implementar la aplicación sin servidor, es necesario crear tres entidades de Cloud Function:

  • Un Cloud Object Storage trigger que se active cuando se sube una imagen al sector de almacenamiento de Cloud Object Storage
  • Una action que analiza la imagen y almacena los resultados del análisis en el mismo sector de almacenamiento
  • Una rule que asocia el desencadenante con la acción

esquema de acción de la regla de activación

Primero, cree un sector de almacenamiento en su instancia de Cloud Object Storage.

Cree un sector de almacenamiento regional

La aplicación sin servidor que usted está a punto de crear utiliza desencadenantes de Cloud Object Storage. Estos desencadenantes son compatibles con los sectores de almacenamiento regionales de las regiones us-east, us-south, eu-gb, eu-de y jp-tok y no son compatibles con los sectores de almacenamiento de múltiples regiones, de un único sitio ni regionales de otras regiones.

  1. Abra su lista de recursos de IBM Cloud en su navegador web y encuentre sus servicios de almacenamiento.
  2. Seleccione su instancia de Cloud Object Storage «cloud-object-storage-lite».
  3. Cree las credenciales de servicio (asignándolas acceso writer) que la aplicación sin servidor utilizará para acceder al sector de almacenamiento. Cree las credenciales de servicio

  4. Cree un sector de almacenamiento regional en us-east, us-south, eu-gb, eu-de o jp-tok.

    Cree un sector de almacenamiento regional

En este tutorial, las instrucciones se refieren a un sector de almacenamiento llamado «vacation-pictures». Los sectores de almacenamiento de la nube pública comparten un espacio de nombres global, lo que significa que los usuarios pueden crear un sector de almacenamiento con el mismo nombre. Por lo tanto, usted debe elegir un nombre diferente para el sector de almacenamiento y usarlo cuando siga los pasos del tutorial.

Configure su IBM Cloud CLI

  1. Abra una ventana del terminal, ejecute IBM Cloud CLI e inicie sesión con su IBM ID:

    ibmcloud login

  2. Muestre la región, el grupo de recursos y el punto final de la API de Cloud Foundry al que apunta su IBM Cloud CLI.

    ibmcloud target

    El resultado se puede parecer al siguiente:

    API endpoint:      https://cloud.ibm.com
    Region:            us-south
    User:              somebody@somewhere.com
    Account:           Somebody's Account (7...g)
    Resource group:    No resource group targeted, use 'ibmcloud target -g RESOURCE_GROUP'
    CF API endpoint:
    Org:
    Space:
    
  3. Si la región que se muestra no coincide con la región en la que usted creó el sector de almacenamiento, ejecute el siguiente comando reemplazando «us-south» por su región:

    ibmcloud target -r us-south

  4. Si no se establece ningún objetivo para el grupo de recursos, ejecute

    ibmcloud target -g default

  5. Si no se establece ningún punto final de la API de Cloud Foundry, ejecute

    ibmcloud target --cf-api api.us-south.cf.cloud.ibm.com

reemplazando «api.us-south.cf.cloud.ibm.com» con el valor apropiado para su región.

Usted ya está listo para comenzar a crear la aplicación sin servidor.

Cree un desencadenante de Cloud Object Storage

Un desencadenante de Cloud Object Storage es un paquete preinstalado de Cloud Functions. Es posible utilizarlo para escuchar los cambios (añadir, cambiar y eliminar) que se realizan en los objetos de un sector de almacenamiento. Cada vez que se produce uno de esos cambios, se activa el desencadenante.

Antes de crear este desencadenante, usted debe crear un espacio de nombres gestionado por edentidades y accesos (IAM) y asignarle el rol Notifications Manager para su instancia de Cloud Object Storage.

Los espacios de nombres gestionados por IAM se utilizan para las entidades de Cloud Function relacionadas con los grupos, como desencadenantes y acciones. Por ejemplo, se pueden almacenar entidades de desarrollo en un espacio de nombres, entidades de control de calidad en otro y entidades de producción en otro diferente.

Si usted ya usó Cloud Functions antes para implementar aplicaciones sin servidor, es posible que ya esté familiarizado con los espacios de nombres basados en Cloud Foundry, que tienen el mismo propósito, pero no son compatibles con las funciones que se necesitan para implementar el monitoreo de sectores de almacenamiento de Cloud Object Storage.

  1. Cree «analyze_images», el espacio de nombres gestionado por IAM para Cloud Functions, que contendrá los artefactos del tutorial. Si usted elige un nombre diferente, asegúrese de que lo especifica en los siguientes comandos:

    ibmcloud fn namespace create analyze_images --description "identify objects in images"

    Para listar sus espacios de nombres, ejecute ibmcloud fn namespace list.

  2. Haga que el contexto de su IBM Cloud CLI sea el espacio de nombres analyze_images. Cuando lo haya hecho, todas las nuevas entidades de Cloud Functions se crearán en este espacio de nombres:

    ibmcloud fn property set --namespace analyze_images

    Para listar las entidades en su espacio de nombres actual, ejecute ibmcloud fn list.

  3. Asigne el rol gestor de notificaciones al espacio de nombres analyze_images. Después de asignar este rol, Cloud Functions podrá ver, modificar y borrar notificaciones de un sector de almacenamiento de Cloud Object Storage. El parámetro source-service-instance-name identifica al espacio de nombres (analyze_images) y target-service-instance-name a la instancia del servicio de Cloud Object Storage (cloud-object-storage-lite) para el que se asigna ese rol:

    ibmcloud iam authorization-policy-create functions cloud-object-storage "Notifications Manager" --source-service-instance-name analyze_images --target-service-instance-name cloud-object-storage-lite

    Si el comando no funcionase y lanzase un error que dice que no se encontró el rol de gestor de notificaciones, el plug-in de IBM Cloud CLI o Cloud Functions que tiene instalado es demasiado antiguo. Actualícelo a la versión más reciente e inténtelo de nuevo.

Ahora que se han cumplido los requisitos previos, es posible crear los desencadenantes de Cloud Object Storage para el espacio de nombres seleccionado y para la instancia de Cloud Object Storage. Recuerde que esos desencadenantes solo pueden monitorear cambios en los sectores de almacenamiento regionales. Actualmente, no monitorean los sectores de almacenamiento de múltiples regiones ni de un solo sitio.

  1. Cree el desencadenante Cloud Object Storage bucket_jpg_write_trigger que se activa cuando se añade o modifica correctamente una imagen (con la extensión «.jpg») en el sector de almacenamiento de Cloud Object Storage vacation-pictures:

    ibmcloud fn trigger create bucket_jpg_write_trigger --feed /whisk.system/cos/changes --param bucket vacation-pictures --param suffix ".jpg" --param event_types write

    Revisemos los tres parámetros:

    • bucket, cuyo valor es vacation-pictures, identifica el sector de almacenamiento que monitoreará este desencadenante.
    • suffix, que es un parámetro opcional (como prefix, que no se utiliza aquí), tiene el valor .jpg. El parámetro se utiliza para definir un filtro, lo que hace que el desencadenante solo se active si se añade o modifica un objeto cuya clave acaba en .jpg. Como resultado, el desencadenante no se activará cuando se suba un video ni, como veremos después, cuando almacenemos los resultados del análisis en este sector de almacenamiento. NOTA: Si usted quiere filtrar por varios sufijos, como .jpg y .png, debe crear un desencadenante para cada sufijo (p. ej., bucket_jpg_write_trigger y bucket_png_write_trigger). Lo mismo se aplica a los prefijos.
    • event_types, otro parámetro opcional cuyo valor es write, se utiliza para identificar el tipo de cambio que activa el desencadenante. Si no se específica, todos los cambios activarán el desencadenante.

      En este tutorial, no queremos que el desencadenante se active cuando se borra una imagen, porque no se pueden obtener más insights de una imagen que no existe.

    Consulte la documentación para conocer la lista completa de valores y parámetros compatibles con los desencadenantes.

    Es posible mostrar la lista de desencadenantes de su espacio de nombres actual ejecutando ibmcloud fn trigger list.

  2. Inspeccione las propiedades del desencadenante:

    ibmcloud fn trigger get bucket_jpg_write_trigger

Después, usted definirá una acción de Cloud Function que contiene código que procesa la imagen.

Cree una acción

La acción es un fragmento de código (escrito en uno de los lenguajes de programación compatibles, como Python y Node.js). En este tutorial crearemos una acción que detecta los objetos de una imagen y almacena los resultados en un archivo JSON del sector de almacenamiento de Cloud Object Storage en el que está la imagen.

La acción requiere de varios parámetros de entrada:

  • El nombre de la imagen que se añadió al sector de almacenamiento monitoreado, o que se modificó en el mismo
  • El nombre del sector de almacenamiento
  • Información de conectividad para la instancia de Cloud Object Storage que el código fuente de la acción puede usar para descargar la imagen del sector de almacenamiento y para almacenar los resultados del análisis

Los nombres de la imagen y del sector de almacenamiento se brindan en la carga útil del desencadenante. Sin embargo, no se brinda a la información de conectividad. Por lo tanto, usted tiene que crear un paquete, vincular su instancia de Cloud Object Storage al paquete (lo que hace que la información de conectividad esté disponible para las acciones dentro del paquete) y almacenar la acción del análisis en el paquete.

  1. Cree un paquete llamado manage_pictures:

    ibmcloud fn package create manage_pictures

    Es posible mostrar la lista de paquetes de su espacio de nombres actual ejecutando ibmcloud fn package list.

  2. Muestre las propiedades del paquete:

    ibmcloud fn package get manage_pictures

    Observe que no existe ninguna vinculación de recursos:

     ...
     {
      "namespace": "...",
      "name": "manage_pictures",
      "version": "0.0.1",
      "publish": false,
      "binding": {}
     }
    
  3. Vincule la instancia cloud-object-storage-lite de Cloud Object Storage al paquete manage_pictures:

    ibmcloud fn service bind cloud-object-storage manage_pictures --instance cloud-object-storage-lite

    La operación dará error si no se definen credenciales del servicio para esta instancia. Si se definen varias credenciales, es posible definir las que se desean con el parámetro --keyname <credentials-name>.

  4. Vuelva a mostrar las propiedades del paquete:

    ibmcloud fn package get manage_pictures

    El resultado ahora debería indicar que se definió el parámetro __bx_creds y que las acciones within this package pueden acceder y usarse para conectar a la instancia cloud-object-storage-lite que usted vinculó al paquete en el paso anterior:

    {
     "namespace": "...",
     "name": "manage_pictures",
     "version": "0.0.1",
     "publish": false,
     "parameters": [
         {
             "key": "__bx_creds",
             "value": {
                 "cloud-object-storage": {
                     "apikey": "...",
                     "cos_hmac_keys": {
                         "access_key_id": "...",
                         "secret_access_key": "..."
                     },
                     "credentials": "...",
                     "endpoints": "https://cos-service.bluemix.net/endpoints",
                     "instance": "cloud-object-storage-lite",
                     ...
                 }
             }
         }],
     ...
    }
    

    Usted tendrá la oportunidad de revisar el código fuente de la acción relevante dentro de un minuto, después de que haya creado la acción.

  5. Cree bucket_write_action en el paquete manage_pictures con el código fuente actions/python/detect_objects.py de Python que se proporciona. Observe que el parámetro kind, que define el entorno del tiempo de ejecución de Cloud Functions, se debe utilizar para ejecutar el código:

    ibmcloud fn action update manage_pictures/bucket_write_action actions/python/detect_objects.py --kind python:3.7

    Es posible mostrar la lista de acciones de su espacio de nombres actual ejecutando ibmcloud fn action list.

  6. Muestre las propiedades de la acción para revisar los ajustes del tiempo de ejecución:

    ibmcloud fn action get manage_pictures/bucket_write_action

    La información de conectividad de su Cloud Object Storage se puede listar como un parámetro.

  7. Revise el código fuente detect_objects.py de la acción en el directorio actions/python/.

    El repositorio de GitHub también contiene una implementación en Node.js de esta acción (y de otras acciones que se mencionan después), que está en actions/js/.

    La acción se implementa en Python y utiliza el SDK de Cloud Object Storage para leer y escribir objetos:

    • La imagen se carga en la memoria desde el sector de almacenamiento específico de Cloud Object Storage.
    • La imagen se envía a un microservicio detector de objetos hospedado en la nube, que identifica los tipos de objetos que aparecen en la imagen.

      Por fines ilustrativos, la aplicación del tutorial está preconfigurada para utilizar una instancia del microservicio de evaluación que es alojada por el Center for Open Source Data and AI Technologies. Las instancias de la evaluación nunca se deben usar para producción. Si usted tiene planes de utilizar frecuentemente un microservicio para analizar sus datos, debería desplegar su propia copia, por ejemplo, en la plataforma de contenedores Red Hat® OpenShift®, tal como se describe en «Desplegar modelos de deep learning en Red Hat OpenShift«.

    • Los resultados que el microservicio devolvió se guardan en formato JSON en el sector de almacenamiento en el que reside la imagen.
    • La acción devuelve el nombre del sector de almacenamiento, la clave del objeto, el tipo de anotación y la clave de anotación del objeto.

    Observe que la acción puede procesar imágenes que tengan cualquier tipo de codificación, incluso cuando el desencadenante definido solo se active cuando se suben imágenes con la codificación JPG. Por eso la acción se llama bucket_write_action, en vez de bucket_jpg_write_action.

En este punto, usted ya creó el desencadenante bucket_jpg_write_trigger y la acción manage_pictures/bucket_write_action. Sin embargo, el desencadenante todavía no está asociado a la acción y, por lo tanto, no se procesará cuando se active el desencadenante.

Cree una regla

La regla asocia un desencadenante a una acción o secuencia (que es, básicamente, un conjunto de acciones). Cuando se activa un desencadenante, la acción (o secuencia) asociada se ejecuta y la carga útil de los desencadenantes se pasa en forma de parámetros.

  1. Cree una regla bucket_jpg_write_rule que asocia bucket_jpg_write_trigger a manage_pictures/bucket_write_action:

    ibmcloud fn rule create bucket_jpg_write_rule bucket_jpg_write_trigger manage_pictures/bucket_write_action

    Es posible mostrar la lista de reglas de su espacio de nombres actual ejecutando ibmcloud fn rule list.

  2. Inspeccione las propiedades de la regla para confirmar que está activa y que asocia el desencadenante a la acción, según se espera:

    ibmcloud fn rule get bucket_jpg_write_rule

Ahora que se creó la regla, la acción se ejecutará todas las veces que una imagen JPG nueva se suba al sector de almacenamiento.

  1. Revise las entidades de Cloud Function que implementan su aplicación sin servidor:

    ibmcloud fn list

    Si el resultado se parece a lo siguiente, usted está listo para probar la aplicación:

    packages
    /.../manage_pictures                  private
    actions
    /.../manage_pictures/bucket_write_action private python:3.7
    triggers
    /.../bucket_jpg_write_trigger         private
    rules
    /.../bucket_jpg_write_rule            private              active
    

Pruebe la aplicación sin servidor

Para probar la aplicación con la GUI:

  1. Suba una imagen JPG al sector de almacenamiento vacation-pictures, p. ej. greenland.jpg. Después de algunos segundos, en el sector de almacenamiento debería aparecer un objeto nuevo llamado annotations/greenland.json.

    Contenido del sector de almacenamiento después de que se hayan subido las imágenes

  2. Suba una imagen PNG (o cualquier otro archivo que tenga una extensión diferente a .jpg) al sector de almacenamiento. En el sector de almacenamiento no debería aparecer ningún archivo JSON nuevo porque no se activó bucket_jpg_write_trigger.

Para monitorear la ejecución de sus entidades de Cloud Function:

  1. Abra el panel de instrumentos de Cloud Functions en su navegador.
  2. Seleccione la pestaña Monitor.
  3. Seleccione el espacio de nombres analyze_images en el menú desplegable de la derecha.

    Monitorear la ejecución de las funciones de la nube

  4. Abra la salida del registro de actividades de manage_pictures/bucket_write_action haciendo clic en el ID de activación (3b...37 de la captura de pantalla anterior). El registro contiene la salida que se haya generado, junto con la respuesta, que se puede parecer a lo siguiente:

    "response":
       {
         "result":
           {
             "annotation_key":"annotations/greenland.json",
             "annotation_type":"max-object-detector",
             "bucket":"vacation-pictures",
             "key":"greenland.jpg"
           },
         "status":"success",
         "success":true
       }
    

Cómo ampliar la aplicación sin servidor

Es posible extender o personalizar la aplicación sin servidor cambiando el código de acción para que realice un tipo de análisis diferente (para cualquier tipo de contenido audiovisual almacenado en Cloud Object Storage). Cuando finalice este tutorial, usted cambiará el código de la acción para generar leyendas para las imágenes y ampliará la aplicación para eliminar el archivo JSON generado, cuando la imagen que tiene asociada se borre del sector de almacenamiento.

Realice un tipo de análisis diferente

La acción bucket_write_action (que está implementada en actions/python/detect_objects.py) que usted creó antes utiliza un microservicio de Model Asset eXchange que detecta objetos en imágenes. Si usted quiere realizar un tipo de análisis diferentes (p. ej., generar una leyenda para la imagen), puede modificar el código fuente de la acción, para que invoque otro servicio de nube que realice la tarea deseada.

El repositorio del tutorial contiene un ejemplo de implementación de la acción actions/python/generate_image_caption.py para el microservicio Image Caption Generator. La principal diferencia que existe entre esta implementación y actions/python/detect_objects.py es la URL que se invoca y la carga útil.

  1. Actualice bucket_write_action para cambiarlo y que genere leyendas de las imágenes:

    ibmcloud fn action update manage_pictures/bucket_write_action actions/python/generate_image_caption.py --kind python:3.7

  2. Suba una imagen JPG al sector de almacenamiento vacation-pictures y asegúrese de que el archivo JSON generado contiene el texto que describe el contenido de la imagen.

    [
     {
         "index": "0",
         "caption": "a dog jumping up to catch a frisbee",
         "probability": 0.001386373609780749
     },
     ...
    ]
    

Elimine automáticamente los archivos de análisis

Es posible ampliar fácilmente la aplicación sin servidor para que elimine los archivos JSON generados automáticamente, cuando se borra una imagen del sector de almacenamiento:

  • Cree un desencadenante que se active cuando un archivo JPG se borra del sector de almacenamiento
  • Cree una acción de borrado que elimine el archivo JSON que está asociado a la imagen
  • Cree una regla que asocia el desencadenante de borrado a la acción de borrado

Complete los siguientes pasos:

  1. Cree un desencadenante de borrado. Observe que el valor del parámetro event_types es delete:

    ibmcloud fn trigger create bucket_jpg_delete_trigger --feed /whisk.system/cos/changes --param bucket vacation-pictures --param suffix ".jpg" --param event_types delete

  2. Cree una acción de borrado. El código fuente de la muestra de la acción está en actions/python/bucket_delete_action.py:

    ibmcloud fn action update manage_pictures/bucket_delete_action actions/python/delete_annotation.py --kind python:3.7

  3. Cree una regla que asocia el desencadenante a la acción:

    ibmcloud fn rule create bucket_jpg_delete_rule bucket_jpg_delete_trigger manage_pictures/bucket_delete_action

  4. Revise las entidades de Cloud Function que acaba de crear.

    ibmcloud fn list

    El resultado se debería aparecer al siguiente:

    packages
    /.../manage_pictures                  private
    actions
    /.../manage_pictures/bucket_delete_action private python:3.7
    /.../manage_pictures/bucket_write_action private python:3.7
    triggers
    /.../bucket_jpg_delete_trigger        private
    /.../bucket_jpg_write_trigger         private
    rules
    /.../bucket_jpg_delete_rule           private              active
    /.../bucket_jpg_write_rule            private              active
    

Para probar la aplicación actualizada, elimine la imagen JPG que subió anteriormente del sector de almacenamiento vacation-pictures. El archivo JSON correspondiente se debería borrar automáticamente.

Soporte de tipos de objeto adicionales

En este tutorial, usted ha creado desencadenantes de Cloud Function que solo se activan cuando se suben imágenes con codificación JPG. Para soportar otras codificaciones de imágenes (p. ej. PNG) usted añadirá más desencadenantes y reglas, rules, tal como se ilustra en el shell create_serverless_app.*, y scripts por lotes en el repositorio del tutorial de GitHub.

Resumen

En este tutorial, usted aprendió a crear una aplicación sin servidor que monitorea el contenido de un sector de almacenamiento de Cloud Object Storage y utiliza microservicios de deep lerning de Model Asset eXchange para analizar el contenido de las imágenes.

Para aprender más acerca de Model Asset eXchange, eche un vistazo a Learning Path: An introduction to the Model Asset eXchange.

Para aprender más acerca de IBM Cloud Functions y de casos de uso habituales, consulte la sección «¿Para qué puedo utilizar Cloud Functions?» de la documentación.

Aviso

El contenido aquí presentado fue traducido de la página IBM Developer US. Puede revisar el contenido original en este link.