L'écosystème de Cloudflare Workers comprend désormais des produits et des fonctionnalités telles que le traitement, l'hébergement, le stockage, les bases de données, le streaming, la connectivité réseau, la sécurité et bien d'autres. Au fil du temps, nous avons essayé d'inspirer les autres à délaisser les architectures logicielles traditionnelles, en démontrant et en documentant de quelle manière il est possible de construire des applications complexes, capables d'évoluer à l'échelle mondiale, avec notre pile.
Aujourd'hui, nous sommes heureux d'accueillir Constellation au sein de la pile Cloudflare. Ce service permet aux développeurs d'exécuter rapidement des modèles d'apprentissage automatique préalablement entraînés ainsi que des tâches d'inférence sur le réseau de Cloudflare.
Une composante de plus au sein de notre Supercloud
Dernièrement, l'apprentissage automatique et l'intelligence artificielle se sont imposés comme des sujets d'actualité ; la réalité, toutefois, est que nous utilisons ces technologies dans notre quotidien depuis des années, même si nous n'en avons pas conscience. Nos téléphones portables, nos ordinateurs, nos voitures et nos assistants domestiques, pour ne citer que quelques exemples, disposent tous de l'IA. Elle est omniprésente.
Cependant, elle n'est pas encore aisément accessible aux développeurs. Ils doivent souvent comprendre les principes mathématiques sur lesquelles elle repose ; les logiciels et les outils sont dispersés et complexes, et les équipements ou les services cloud indispensables à l'exécution des frameworks et des données sont coûteux.
Aujourd'hui, nous introduisons, dans notre pile, une nouvelle fonctionnalité, qui permettra à tous les utilisateurs d'exécuter des modèles d'apprentissage automatique et d'exécuter des inférences sur Cloudflare Workers.
Découvrez Constellation
Constellation vous permet d'exécuter rapidement des tâches d'inférence à faible latence sur des modèles d'apprentissage automatique préalablement entraînés avec des scripts Cloudflare Workers.
Voici quelques exemples d'applications que vous pouvez déployer avec Constellation :
Classification d'images ou d'audio ou détection d'objets
Détection d'anomalies dans des données
Traduction, résumé ou analyse de similarité de textes
Traitement du langage naturel
Analyse des sentiments
Reconnaissance vocale ou synthèse vocale
Réponses à des questions
Les développeurs peuvent transférer n'importe quel modèle pris en charge vers Constellation. Ils peuvent entraîner un modèle indépendamment, ou transférer des modèles préalablement entraînés depuis des portails d'apprentissage automatique tels que HuggingFace ou ONNX Zoo.
Cependant, tous les utilisateurs ne souhaitent pas former des modèles ou parcourir l'Internet à la recherche de modèles qu'ils n'ont pas encore testés ; c'est pourquoi Cloudflare conservera également un catalogue de modèles vérifiés et prêts à l'emploi.
Nous avons conçu Constellation dans l'optique de prioriser l'expérience des développeurs et la simplicité d'utilisation des API. Voici un exemple pour vous aider à vous lancer.
Application de classification d'images
Dans cet exemple, nous allons créer une application de classification d'images reposant sur l'API d'inférence de Constellation et le modèle SqueezeNet, un réseau neuronal convolutif (CNN, « Convolutional Neural Network »), qui a été préalablement entraîné avec plus d'un million d'images issues de la base de données open source ImageNet, et qui peut assurer la classification d'images dans 1 000 catégories maximum.
Comparé à AlexNet, l'un des réseaux CNN originaux et un modèle de référence en matière de classification d'images, SqueezeNet est beaucoup plus rapide (environ 3x) et beaucoup moins volumineux (environ 500x), tout en offrant des niveaux de précision similaires. Son faible encombrement en fait un outil idéal pour les appareils portables dotés de ressources limitées ou les équipements sur mesure.
Pour commencer, créons un nouveau projet Constellation avec l'environnement d'exécution ONNX. Wrangler propose désormais une fonctionnalité intégrée pour Constellation avec le mot-clé « constellation
».
Créons maintenant le fichier de configuration wrangler.toml
avec la liaison de projet :
$ npx wrangler constellation project create "image-classifier" ONNX
Installation de la bibliothèque d'API du client 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'
},
]
Transférez le modèle ONNX SqueezeNet 1.1 préalablement entraîné vers le projet.
$ npm install @cloudflare/constellation --save-dev
Comme nous l'avons dit plus haut, SqueezeNet assure la classification d'images dans 1 000 classes d'objets maximum. Concrètement, ces classes se présentent sous la forme d'une liste d'ensembles de synonymes, ou « synset ». Un synset comporte un identifiant et un intitulé ; il est issu de WordNet, la base de données terminologique de l'Université Princeton, qui est également utilisée pour l'identification du contenu de la base de données d'images 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
Pour traduire les résultats de SqueezeNet sous forme de classes d'images en langage humain intelligible, nous avons besoin d'un fichier qui associe les identifiants de synset (c'est-à-dire ce que nous obtenons du modèle) et les identifiants correspondants.
Enfin, codons et déployons notre script de classification d'images :
$ mkdir src; cd src
$ wget https://raw.githubusercontent.com/microsoft/onnxjs-demo/master/src/data/imagenet.ts
Ce script lit une image depuis la requête, la décode sous forme de tenseur multidimensionnel float32 (à l'heure actuelle, seules les images au format PNG sont décodées, mais nous pouvons en ajouter d'autres), la transmet au modèle SqueezeNet en cours d'exécution dans Constellation, obtient les résultats, les associe à la liste de classes d'ImageNet, puis renvoie les identifiants en langage intelligible humain correspondant à l'image.
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
}
C'est plutôt simple, non ? Testons le script ensemble :
Ici, vous pouvez observer les probabilités en action. Le modèle est assez sûr de la montagne alpine et du cabriolet, mais la probabilité du podenco d'Ibiza est plus faible. En effet, le chien représenté sur la photo est d'une race différente.
$ 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
Cette petite application démontre à quel point il est facile et rapide d'utiliser des modèles d'apprentissage automatique et Constellation lors de la création d'applications avec Workers. Vous pouvez consulter le code source complet ici et le déployer vous-même.
Transformeurs
Les transformeurs ont été inaugurés par Google ; il s'agit de modèles d'apprentissage profond conçus pour traiter des données séquentielles fournies en entrée. Ils sont communément utilisés dans des applications de traitement du langage naturel (NLP, « Natural Language Processing »), telles que les traductions, les résumés ou l'analyse de sentiments, ainsi que dans les tâches d'interprétation de données visuelles (CV, « Computer Vision »), telles que la classification d'images.
Transformers.js est une démo fréquemment utilisée, qui charge des modèles de transformeurs depuis HuggingFace et les exécute dans votre navigateur à l'aide de l'environnement d'exécution ONNX compilé en WebAssembly. Au lieu de WebAssembly, nous avons transféré cette démo afin d'utiliser les API de Constellation.
Voici le lien vers notre version : https://transformers-js.pages.dev/
Interopérabilité avec Workers
L'autre aspect intéressant de Constellation est que, puisque le service s'exécute nativement dans Workers, vous pouvez l'orchestrer avec d'autres produits et API de notre pile. Vous pouvez utiliser KV, R2, D1, Queues – tous les services de votre choix, même les e-mails !
Voici un exemple d'instance Workers permettant de recevoir les e-mails adressés à votre domaine sur Cloudflare avec le service Email Routing, d'exécuter Constellation avec le modèle d'analyse de sentiment t5-small, d'ajouter un en-tête avec le score résultant, puis de transférer l'e-mail à l'adresse de destination.
Vous pouvez maintenant utiliser Gmail ou tout autre client de messagerie pour appliquer à vos messages une règle sur la base de l'en-tête « X-Sentiment ». Par exemple, vous pouvez souhaiter déplacer tous les messages contenant un langage colérique hors de votre boîte de réception, vers un autre dossier, dès leur réception.
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("[email protected]", headers);
}
}
Commencez à utiliser Constellation
Le lancement de Constellation en version bêta privée a lieu aujourd'hui. Pour vous inscrire sur la liste d'attente, accédez au tableau de bord, cliquez sur l'onglet Workers sous votre compte, puis cliquez sur le bouton « Request access » (Demander l'accès). L'équipe assurera l'intégration des comptes par lots ; vous recevrez un e-mail lorsque votre compte sera activé.
En attendant, vous pouvez consulter la documentation pour développeurs de Constellation afin d'en apprendre davantage sur son fonctionnement et ses API. Le service Constellation peut être utilisé depuis Wrangler, notre outil de ligne de commande permettant de configurer, développer et déployer des applications avec les produits pour développeurs de Cloudflare ; vous pouvez également le gérer directement depuis l'interface utilisateur du tableau de bord.
Nous sommes impatients de découvrir comment vous avez l'intention d'utiliser l'apprentissage automatique et l'intelligence artificielle dans vos applications. Constellation bénéficiera de nouvelles améliorations, avec des limites plus élevées, la prise en charge d'un plus grand nombre d'environnements d'exécution et des modèles plus vastes ; toutefois, nous voulons connaître votre avis, et vos commentaires influenceront certainement nos décisions concernant la feuille de route du service.
Une dernière chose – aujourd'hui, nous avons parlé de la façon dont vous pouvez écrire des instances Workers qui utilisent Constellation, mais voici une information concernant sa création : le service Constellation lui-même a été développé grâce à la puissance de WebAssembly, de Workers, de R2 et de nos API. Nous proposerons prochainement un article de blog sur son développement ; restez à l'écoute !
Comme d'habitude, vous pouvez échanger avec nous sur le Discord Cloudflare Developers (rejoignez le canal #constellation) ou le forum de la communauté ; notre équipe est à votre écoute.