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.
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
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.
- Abra su lista de recursos de IBM Cloud en su navegador web y encuentre sus servicios de almacenamiento.
- Seleccione su instancia de Cloud Object Storage «cloud-object-storage-lite».
Cree las credenciales de servicio (asignándolas acceso writer) que la aplicación sin servidor utilizará para acceder al sector de almacenamiento.
Cree un sector de almacenamiento regional en us-east, us-south, eu-gb, eu-de o jp-tok.
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
Abra una ventana del terminal, ejecute IBM Cloud CLI e inicie sesión con su IBM ID:
ibmcloud login
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:
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
Si no se establece ningún objetivo para el grupo de recursos, ejecute
ibmcloud target -g default
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.
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
.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
.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ámetrosource-service-instance-name
identifica al espacio de nombres (analyze_images
) ytarget-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.
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 Storagevacation-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 esvacation-pictures
, identifica el sector de almacenamiento que monitoreará este desencadenante.suffix
, que es un parámetro opcional (comoprefix
, 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
ybucket_png_write_trigger
). Lo mismo se aplica a los prefijos.event_types
, otro parámetro opcional cuyo valor eswrite
, 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
.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.
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
.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": {} }
Vincule la instancia
cloud-object-storage-lite
de Cloud Object Storage al paquetemanage_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>
.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 instanciacloud-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.
Cree
bucket_write_action
en el paquetemanage_pictures
con el código fuenteactions/python/detect_objects.py
de Python que se proporciona. Observe que el parámetrokind
, 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
.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.
Revise el código fuente
detect_objects.py
de la acción en el directorioactions/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 debucket_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.
Cree una regla
bucket_jpg_write_rule
que asociabucket_jpg_write_trigger
amanage_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
.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.
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:
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 llamadoannotations/greenland.json
.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:
- Abra el panel de instrumentos de Cloud Functions en su navegador.
- Seleccione la pestaña Monitor.
Seleccione el espacio de nombres analyze_images en el menú desplegable de la derecha.
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.
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
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:
Cree un desencadenante de borrado. Observe que el valor del parámetro
event_types
esdelete
:ibmcloud fn trigger create bucket_jpg_delete_trigger --feed /whisk.system/cos/changes --param bucket vacation-pictures --param suffix ".jpg" --param event_types delete
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
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
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.