El ecosistema de Cloudflare Workers ofrece ahora productos y funciones que incluyen el proceso, el alojamiento, el almacenamiento, las bases de datos, el streaming, las redes, la seguridad y mucho más. Con el tiempo, hemos intentado motivar a otros para que se alejen de las arquitecturas de software tradicionales, y para ello hemos demostrado y documentado cómo es posible crear aplicaciones complejas que se amplían globalmente sobre nuestra pila.
Hoy nos complace dar la bienvenida a Constellation, una nueva función de la pila de Cloudflare que permite a los desarrolladores ejecutar modelos de aprendizaje automático entrenados previamente y tareas de inferencia en la red de Cloudflare.
Un bloque de creación más en nuestra supernube
El aprendizaje automático y la IA han sido temas candentes últimamente, pero la realidad es que llevamos años utilizando estas tecnologías en nuestra vida cotidiana, aunque no nos demos cuenta. Nuestros teléfonos móviles, ordenadores, coches y asistentes domésticos, por poner algunos ejemplos, todos tienen IA. Está en todas partes.
Sin embargo, sigue sin ser una ventaja para los desarrolladores. A menudo necesitan entender las matemáticas que hay detrás, el software y las herramientas están dispersos y son complejos, y el hardware o los servicios en la nube para ejecutar los marcos y los datos son caros.
Hoy lanzamos una nueva función de nuestra pila, que permite a todo el mundo ejecutar modelos de aprendizaje automático y realizar inferencias sobre Cloudflare Workers.
Novedad: Constellation
Constellation te permite ejecutar tareas de inferencia rápidas y de baja latencia utilizando modelos de aprendizaje automático entrenados previamente de forma nativa con los scripts de Cloudflare Workers.
Algunos ejemplos de aplicaciones que puedes implementar con Constellation son:
Clasificación de imágenes o audio o detección de objetos
Detección de anomalías en los datos
Traducción, resumen o análisis de similitud de textos
Procesamiento del lenguaje natural
Análisis de opiniones
Reconocimiento de voz o conversión de texto a voz
Respuesta a preguntas
Los desarrolladores pueden cargar a Constellation cualquier modelo compatible, que pueden entrenar de forma independiente, o bien descargar modelos entrenados previamente de centros de aprendizaje automático como HuggingFace u ONNX Zoo.
Sin embargo, no todos querrán entrenar modelos o buscar en Internet modelos que aún no haya probado. Por esa razón, Cloudflare también mantendrá un catálogo de modelos verificados y listos para usar.
Creamos Constellation pensando en ofrecer una gran experiencia para los desarrolladores y API fáciles de usar. Aquí tienes un ejemplo para empezar.
Aplicación de clasificación de imágenes
En este ejemplo, crearemos una aplicación de clasificación de imágenes basada en la API de inferencia de Constellation y el modelo SqueezeNet, una red neuronal convolucional (CNN) que se entrenó previamente en más de un millón de imágenes de la base de datos de código abierto ImageNet y puede clasificar imágenes en 1000 categorías, como máximo.
SqueezeNet se compara con AlexNet, una de las CNN originales y punto de referencia para la clasificación de imágenes, por ser aproximadamente 3 veces más rápida y más o menos 500 veces más pequeña sin dejar de alcanzar niveles similares de precisión. Su reducido tamaño permite que se pueda ejecutar en dispositivos portátiles con recursos limitados o hardware personalizado.
En primer lugar, vamos a crear un nuevo proyecto Constellation utilizando el entorno de ejecución de ONNX. Wrangler ya tiene incorporada la funcionalidad para Constellation con la palabra clave `constellation`.
Ahora vamos a crear el archivo de configuración wrangler.toml
con el enlace del proyecto:
$ npx wrangler constellation project create "image-classifier" ONNX
Instala la biblioteca API del cliente Constellation:
# Top-level configuration
name = "image-classifier-worker"
main = "src/index.ts"
compatibility_date = "2022-07-12"
constellation = [
{
binding = 'CLASSIFIER',
project_id = '2193053a-af0a-40a6-b757-00fa73908ef6'
},
]
Carga al proyecto el modelo ONNX SqueezeNet 1.1 entrenado previamente.
$ npm install @cloudflare/constellation --save-dev
Como hemos mencionado antes, SqueezeNet clasifica las imágenes en un máximo de 1000 clases de objetos. Estas clases tienen en realidad la forma de una lista de anillos de sinónimos o synsets. Un synset tiene un Id. y una etiqueta. Proviene de la terminología de la base de datos WordNet de Princeton, la misma que se utiliza para etiquetar la base de datos de imágenes, ImageNet.
$ wget https://github.com/microsoft/onnxjs-demo/raw/master/docs/squeezenet1_1.onnx
$ npx wrangler constellation model upload "image-classifier" "squeezenet11" squeezenet1_1.onnx
Para traducir los resultados de SqueezeNet en clases de imágenes legibles por humanos, necesitamos un archivo que asigne los Id. de synset (lo que obtenemos del modelo) con sus etiquetas correspondientes.
Y por último, vamos a codificar e implementar nuestro script de clasificación de imágenes:
$ mkdir src; cd src
$ wget https://raw.githubusercontent.com/microsoft/onnxjs-demo/master/src/data/imagenet.ts
Este script lee una imagen de la solicitud, la descodifica en un tensor multidimensional float32 (ahora mismo solo descodificamos PNG, pero podemos añadir otros formatos), la proporciona al modelo SqueezeNet que se ejecuta en Constellation, obtiene los resultados, los combina con la lista de clases de ImageNet y devuelve las etiquetas de la imagen legibles por humanos.
import { imagenetClasses } from './imagenet';
import { Tensor, run } from '@cloudflare/constellation';
export interface Env {
CLASSIFIER: any,
}
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext) {
const formData = await request.formData();
const file = formData.get("file");
const data = await file.arrayBuffer();
const result = await processImage(env, data);
return new Response(JSON.stringify(result));
},
};
async function processImage(env: Env, data: ArrayBuffer) {
const input = await decodeImage(data)
const tensorInput = new Tensor("float32", [1, 3, 224, 224], input)
const output = await run(env.CLASSIFIER, "MODEL-UUID", tensorInput);
const probs = output.squeezenet0_flatten0_reshape0.value
const softmaxResult = softmax(probs)
const results = imagenetClasses(softmaxResult, 5);
const topResult = results[0];
return topResult
}
Bastante sencillo, ¿no? Vamos a probarlo:
A continuación, puedes ver las probabilidades en la práctica. El modelo está bastante seguro sobre las montañas y el descapotable, pero la probabilidad del podenco ibicenco es menor. Efectivamente, el perro de la foto es de otra raza.
$ curl https://ai.cloudflare.com/demos/image-classifier -F file=@images/mountain.png | jq .name
alp
$ curl https://ai.cloudflare.com/demos/image-classifier -F file=@images/car.png | jq .name
convertible
$ curl https://ai.cloudflare.com/demos/image-classifier -F file=@images/dog.png | jq .name
Ibizan hound
Esta pequeña aplicación demuestra lo fácil y rápido que puedes empezar a utilizar modelos de aprendizaje automático y Constellation al crear aplicaciones sobre Workers. Consulta el código fuente completo aquí e impleméntalo tú mismo.
Transformadores
Google introdujo los transformadores, que son modelos de aprendizaje profundo diseñados para procesar datos de entrada secuenciales y se utilizan normalmente para el procesamiento del lenguaje natural (PLN), como traducciones, resúmenes o análisis de sentimientos, y tareas de visión por ordenador, como la clasificación de imágenes.
Transformers.js es una popular demostración que carga modelos de transformadores de HuggingFace y los ejecuta dentro de tu navegador utilizando el entorno de ejecución de ONNX compilado a WebAssembly. Hemos adaptado esta demostración para que utilice las API de Constellation.
Aquí tienes el enlace a nuestra versión: https://transformers-js.pages.dev/
Interoperabilidad con Workers
El otro elemento interesante de Constellation es que, como se ejecuta de forma nativa en Workers, puedes agruparla con otros productos y las API de nuestra pila. Puedes utilizar KV, R2, D1, Queues, lo que quieras, incluso el correo electrónico.
A continuación, te mostramos un ejemplo de un Worker que recibe correos electrónicos para tu dominio en Cloudflare utilizando Email Routing, ejecuta Constellation utilizando el modelo de análisis de sentimiento t5-small, añade un encabezado con la puntuación resultante, y lo reenvía a la dirección de destino.
Ahora puedes utilizar Gmail o cualquier cliente de correo electrónico para aplicar una regla a tus mensajes basada en el encabezado "X-Sentiment". Por ejemplo, puede que quieras mover todos los correos molestos que estén fuera de tu bandeja de entrada a una carpeta diferente cuando lleguen.
import { Tensor, run } from '@cloudflare/constellation';
import * as PostalMime from 'postal-mime';
export interface Env {
SENTIMENT: any,
}
export default {
async email(message, env, ctx) {
const rawEmail = await streamToArrayBuffer(event.raw, event.rawSize);
const parser = new PostalMime.default();
const parsedEmail = await parser.parse(rawEmail);
const input = tokenize(parsedEmail.text)
const output = await run( env.SENTIMENT, "MODEL-UUID", input);
var headers = new Headers();
headers.set("X-Sentiment", idToLabel[output.label]);
await message.forward("gooddestination@example.com", headers);
}
}
Empieza a utilizar Constellation
Hoy, lanzamos Constellation en versión beta privada. Para unirte a la lista de espera, ve al panel de control, haz clic en la pestaña Workers debajo de tu cuenta y haz clic en "Solicitar acceso". El equipo irá incorporando cuentas por grupos. Recibirás un correo electrónico cuando tu cuenta esté habilitada.
Mientras tanto, puedes leer nuestra documentación para desarrolladores sobre Constellation y obtener más información sobre su funcionamiento y las API. Constellation se puede utilizar desde Wrangler, nuestra herramienta de línea de comandos para configurar, crear e implementar aplicaciones con los productos para desarrolladores de Cloudflare, o la puedes gestionar directamente en la interfaz de usuario del panel de control.
Estamos deseando saber cómo quieres utilizar el aprendizaje automático y la inteligencia artificial con tus aplicaciones. Constellation seguirá mejorando con límites más altos, nuevos entornos de ejecución compatibles y otros modelos más grandes, pero queremos saber de ti. Tu opinión influirá, sin duda, en nuestras decisiones sobre la hoja de ruta.
Una última cosa. Hoy hemos estado hablando de cómo puedes escribir Workers que utilicen Constellation, pero atento a este dato inicial. Constellation se creó utilizando la capacidad de WebAssembly, Workers, R2 y nuestras API. Procuraremos escribir un blog de seguimiento sobre cómo lo desarrollamos. No te lo pierdas.
Como siempre, puedes hablar con nosotros en nuestro Developers Discord (únete al canal #constellation) o en el foro de la comunidad. Te escuchamos.