Former un modèle à l'aide d'un web worker,Former un modèle à l'aide d'un web worker

Dans ce didacticiel, vous explorerez un exemple d'application Web qui utilise un travailleur Web pour entraîner un réseau neuronal récurrent (RNN) à effectuer une addition d'entiers. L'exemple d'application ne définit pas explicitement l'opérateur d'addition. Au lieu de cela, il entraîne le RNN à l’aide d’exemples de sommes.

Bien sûr, ce n’est pas la manière la plus efficace d’ajouter deux entiers ! Mais le didacticiel montre une technique importante dans le Web ML : comment effectuer des calculs de longue durée sans bloquer le thread principal, qui gère la logique de l'interface utilisateur.

L'exemple d'application de ce didacticiel est disponible en ligne . Vous n'avez donc pas besoin de télécharger de code ni de configurer un environnement de développement. Si vous souhaitez exécuter le code localement, suivez les étapes facultatives dans Exécuter l'exemple localement . Si vous ne souhaitez pas configurer d'environnement de développement, vous pouvez passer à Explorer l'exemple .

L'exemple de code est disponible sur GitHub .

(Facultatif) Exécutez l'exemple localement

Conditions préalables

Pour exécuter l'exemple d'application localement, vous devez installer les éléments suivants dans votre environnement de développement :

Installez et exécutez l'exemple d'application

  1. Clonez ou téléchargez le référentiel tfjs-examples .
  2. Accédez au répertoire addition-rnn-webworker :

    cd tfjs-examples/addition-rnn-webworker
    
  3. Installer les dépendances :

    yarn
    
  4. Démarrez le serveur de développement :

    yarn run watch
    

Explorez l'exemple

Ouvrez l'exemple d'application . (Ou, si vous exécutez l'exemple localement, accédez à http://localhost:1234 dans votre navigateur.)

Vous devriez voir une page intitulée TensorFlow.js: Addition RNN . Suivez les instructions pour essayer l'application.

À l'aide du formulaire Web, vous pouvez mettre à jour certains des paramètres utilisés pour entraîner le modèle, notamment les suivants :

  • Chiffres : Le nombre maximum de chiffres dans les termes à ajouter.
  • Taille de la formation : le nombre d'exemples de formation à générer.
  • Type RNN : un parmi SimpleRNN , GRU ou LSTM .
  • RNN Hidden Layer Size : Dimensionnalité de l'espace de sortie (doit être un entier positif).
  • Taille du lot : nombre d'échantillons par mise à jour du dégradé.
  • Train Itérations : nombre de fois pour entraîner le modèle en appelant model.fit()
  • # of test examples : Nombre d'exemples de chaînes (par exemple, 27+41 ) à générer.

Essayez d'entraîner le modèle avec différents paramètres et voyez si vous pouvez améliorer la précision des prédictions pour différents ensembles de chiffres. Notez également comment le temps d'ajustement du modèle est affecté par différents paramètres.

Explorez le code

L'exemple d'application illustre certains des paramètres que vous pouvez configurer pour la formation d'un RNN. Il démontre également l'utilisation d'un travailleur Web pour entraîner un modèle à partir du thread principal. Les Web Workers sont importants dans le Web ML car ils vous permettent d'exécuter des tâches de formation coûteuses en termes de calcul sur un thread d'arrière-plan, évitant ainsi les problèmes de performances potentiellement impactants pour l'utilisateur sur le thread principal. Les threads principal et de travail communiquent entre eux via des événements de message.

Pour en savoir plus sur les Web Workers, consultez API Web Workers et Utilisation des Web Workers .

Le module principal de l'exemple d'application est index.js . Le script index.js crée un Web Worker qui exécute le module worker.js :

const worker =
    new Worker(new URL('./worker.js', import.meta.url), {type: 'module'});

index.js est en grande partie composé d'une seule fonction, runAdditionRNNDemo , qui gère la soumission du formulaire, traite les données du formulaire, transmet les données du formulaire au travailleur, attend que le travailleur entraîne le modèle et renvoie les résultats, puis affiche les résultats sur la page. .

Pour envoyer les données du formulaire au travailleur, le script appelle postMessage sur le travailleur :

worker.postMessage({
  digits,
  trainingSize,
  rnnType,
  layers,
  hiddenSize,
  trainIterations,
  batchSize,
  numTestExamples
});

Le travailleur écoute ce message et transmet les données du formulaire aux fonctions qui préparent les données et démarrent la formation :

self.addEventListener('message', async (e) => {
  const { digits, trainingSize, rnnType, layers, hiddenSize, trainIterations, batchSize, numTestExamples } = e.data;
  const demo = new AdditionRNNDemo(digits, trainingSize, rnnType, layers, hiddenSize);
  await demo.train(trainIterations, batchSize, numTestExamples);
})

Pendant la formation, le travailleur peut envoyer deux types de messages différents, l'un avec isPredict défini sur true

self.postMessage({
  isPredict: true,
  i, iterations, modelFitTime,
  lossValues, accuracyValues,
});

et l'autre avec isPredict défini sur false .

self.postMessage({
  isPredict: false,
  isCorrect, examples
});

Lorsque le thread d'interface utilisateur ( index.js ) gère les événements de message, il vérifie l'indicateur isPredict pour déterminer la forme des données renvoyées par le travailleur. Si isPredict est vrai, les données doivent représenter une prédiction et le script met à jour la page à l'aide de tfjs-vis . Si isPredict est faux, le script exécute un bloc de code qui suppose que les données représentent des exemples. Il encapsule les données en HTML et insère le HTML dans la page.

Et après

Ce didacticiel a fourni un exemple d'utilisation d'un Web Worker pour éviter de bloquer le thread de l'interface utilisateur avec un processus de formation de longue durée. Pour en savoir plus sur les avantages d'effectuer des calculs coûteux sur un thread d'arrière-plan, consultez Utiliser des Web Workers pour exécuter JavaScript à partir du thread principal du navigateur .

Pour en savoir plus sur la formation d'un modèle TensorFlow.js, consultez Modèles de formation .