Solution type : Recommandeur de films

Si ce n’est déjà fait, lisez le Plan de vol du Propulseur, L’apprentissage machine appliqué à un système de recommandation automatique, avant de tester la solution type.

Introduction

Le propulseur « Recommandeur de films » est une solution exécutable avec laquelle l’utilisateur pourra observer et étudier le fonctionnement d’un modèle à filtrage collaboratif formulant des recommandations en fonction de comportements passésCe document décrit la solution et les technologies de pointe qu’elle met en application.

On trouvera la définition des abréviations et des expressions en italique dans le glossaire.

Énoncé du problème

Peu importe la nature de l’entreprise avec laquelle l’utilisateur fait affaire en ligne, les possibilités abondent dans le monde contemporain, qu’on souhaite choisir un livre, une émission de télévision, un film, un nouvel appareil électronique, voire des articles d’épicerie. Lorsque le consommateur est confronté à des choix par milliers, centaines sinon dizaines, l’entreprise doit absolument disposer d’outils qui l’aideront à établir rapidement ce qui l’intéresse ou pas.

Les systèmes de recommandation automatiques recourent à l’apprentissage machine pour résoudre le problème et les fournisseurs de contenu ainsi que les détaillants ne peuvent désormais plus s’en passer. Ces systèmes recourent à diverses informations comme les renseignements démographiques sur l’utilisateur, ses habitudes, la description du produit ou la note que le consommateur lui attribue pour prévoir ce qui est le plus susceptible de l’intéresser à un moment donné. Sans recommandations, l’utilisateur vivra une expérience douloureuse, car il gaspillera énormément de temps à chercher ce qui l’intéresse pour sans doute finir par abandonner au bout du compte.

Solution type

La solution type montre comment utiliser TensorFlow et TensorRT pour créer un modèle de filtrage collaboratif fonctionnant sur GPU qui recommandera les films à regarder.

Aperçu

La solution propose un système complet de recommandation reposant sur un modèle de filtrage collaboratif formé par apprentissage profond à partir des données sur l’utilisateur.

Le filtrage collaboratif est une approche à laquelle on recourt abondamment pour mettre en place un système de recommandation. Cette technique de filtrage repose sur les habitudes, les activités ou les goûts de l’utilisateur, et prévoit ce qui lui plaira d’après ses ressemblances avec d’autres utilisateurs. Un des principaux avantages du filtrage collaboratif est qu’il s’appuie uniquement sur le comportement de l’utilisateur, sans lui réclamer d’autres informations sur lui ou le produit, de sorte qu’on peut l’appliquer indifféremment à une multitude d’entreprises qui n’auraient peut-être pas accès à des informations de ce genre.

La solution suppose la création d’un modèle d’apprentissage profond avec Python et TensorFlow, puis son déploiement dans un environnement de production utilisant la bibliothèque TensorRT de NVIDIA et son serveur d’inférence. Les débutants comme les développeurs aguerris utilisent souvent la bibliothèque Python dans leurs projets d’apprentissage machine. TensorFlow et TensorRT figurent dans les ressources en nuage de l’ATIR, ce qui facilitera le développement de modèles d’apprentissage profond de moyenne à grande envergure.

Le modèle d’apprentissage profond est un perceptron multicouche similaire à celui proposé dans l’article Neural Collaborative Filtering (He et coll. 2017). Le problème en est un de classification et on forme le réseau neuronal en attribuant une valeur positive aux films qui ont été regardés et cotés par d’autres utilisateurs et une valeur négative à ceux qui n’ont pas été visionnés.

Pour former le modèle, on recourt à la banque de données publique Movielens, qui rassemble des informations sur les longs métrages et la cote que leur ont attribuée les cinéphiles. Cette banque est disponible à des fins non commerciales et on s’en sert souvent dans les tutoriels et les projets de recherche.

Diagramme de la solution

Le diagramme que voici illustre comment la solution est structurée.

Recommandeur de films

La solution comprend un orchestrateur qui coordonne les déploiements sur la plateforme d’infonuagique de l’ATIR et deux sous-systèmes Python dans le nuage : un pipeline hors ligne et un service en ligne. Le composant hors ligne actionne la phase expérimentale du projet d’apprentissage machine. Autrement dit, il produit un modèle en fonction des données obtenues par l’apprentissage machine; le sous-système en ligne est le service qui recommande des films à l’utilisateur en s’appuyant sur les prévisions du modèle. L’utilisateur n’exploite pas ou ne consulte pas le composant hors ligne en temps réel. Ce dernier a été utilisé (sans doute plusieurs fois) avant le lancement du service et le sera périodiquement par la suite de manière à perfectionner le modèle, quand de nouvelles données ou de nouveaux modèles deviennent disponibles. Le composant en ligne comprend une application cliente qui relaye les demandes au service de prévision. Il est aisé de voir comment un système de plus grande envergure pourrait intégrer la solution type.

Description

Le tableau ci-dessous expose brièvement les principaux éléments de la solution.

Composant Résumé
Orchestrateur Jeu de scripts qui coordonne le déploiement des autres composants sur la plateforme de l’ATIR.
Pipeline de traitement Recueille les données d’une source externe et les traite pour que le module de formation du modèle puisse s’en servir (épuration, formatage, etc.).
Module de formation 1

Module de formation 2

Scripts TensorFlow qui créent, forment et évaluent le modèle d’apprentissage machine avec les données traitées. En découle le fichier du modèle et des rapports sur la performance de ce dernier.
Exportateur Adapte et exporte le modèle produit par le module de formation pour fournir un modèle TensorRT.
Serveur d’inférence à GPU Serveur TensorRT en ligne effectuant des prévisions d’après les données saisies avec le modèle avec interface graphique.
Client léger Script sous forme de ligne de commande faisant office d’application cliente qui formule une demande au serveur d’inférence à interface graphique. L’utilisateur s’en sert pour accéder au système de recommandation.

Démonstration de la technologie

La partie qui suit montre comment fonctionne le système de recommandation. Y recourir est tentant pour le consommateur, car cela lui permet de rétrécir son champ de recherche à ce qui l’intéresse le plus.

Dans la démonstration, le modèle recommande des longs métrages d’après les films que d’autres cinéphiles ont aimés et cotés.

Déploiement et configuration

Si vous êtes un participant de l’ATIR et avez accès à une unité de traitement graphique (GPU), suivez les instructions ci-dessous pour déployer la Solution type. Pour cela, vous devrez toutefois d’abord avoir ouvert un compte dans le nuage OpenStack de l’ATIR ou avoir formulé une demande en ce sens, et avoir accès à une GPU.

  1. Ouvrez une séance sur la plateforme en nuage OpenStack de l’ATIR.
  2. Allez à Projects > Orchestration > Stacks et cliquez le bouton + Launch Stack.

3. Dans la boîte de dialogue Select Template, sélectionnez URL comme source du modèle et collez l’URL:

https://gpu-boosterpack-heat-templates.s3.ca-central-1.amazonaws.com/movierec.yaml

dans le champ Template URL, puis cliquez Next.

Dans la boîte de dialogue Launch Stack, configurez l’application de la façon indiquée sur l’illustration ci-dessous, comme suit :

  1. donnez un nom à la pile (Stack Name);
  2. donnez un mot de passe (Password) à l’utilisateur (n’importe quoi sauf des espaces);
  3. inscrivez « v3.medium » pour le type d’instance (Flavor/Instance Type);
  4. inscrivez « Ubuntu 22.04 – vGPU – 525 » pour l’image (Image).

Ensuite, cliquez Launch.

4. Le déploiement de l’application dure cinq à dix minutes. Les scripts postérieurs au provisionnement s’exécutent automatiquement et configurent la plateforme en fonction de la Solution type.

Le déploiement terminé, vous devrez copier la clé privée pour pouvoir ouvrir une console (SSH) sur la nouvelle instance de la GPU qui vient d’être créée.

5. Pour obtenir la clé privée, cliquez le nom de la pile (Stack Name) et parcourez la liste jusqu’au champ private.key. Copiez-en le contenu, dont vous vous servirez pour votre client SSH.

Configuration et lancement de l’application

Après le déploiement de l’application, amorcez une console pour l’instance de la GPU avec SSH en utilisant l’adresse IP externe que vous trouverez à Project > Compute > Instances, tel qu’indiqué ci-dessous.

Ouvrez une séance SSH avec l’adresse IP et l’identifiant « ubuntu », sans mot de passe.

Lancement de l’application

L’application est prête à être utilisée dès que le déploiement est terminé. Pour cela, vous aurez besoin de son adresse IP, qui se trouve sur la page détaillant l’instance, tel qu’indiqué à la dernière étape de la partie précédente.

Tout d’abord, connectez-vous à l’instance par SSH. Si vous avez besoin d’aide, consultez le guide technique de l’ATIR sur Linux.

Après ouverture de la séance, attachez le contenant Docker intitulé trtclient en exécutant la commande suivante :
sudo docker attach trtclient

Une fois le contenant annexé, cliquez Entrée de nouveau. Vous êtes maintenant à l’intérieur du contenant Docker renfermant la ligne de commande de l’application cliente. Pour lancer celle-ci, exécutez ce qui suit :
python3 /workspace/movierec/trt_client.py

Des instructions expliquent comment se servir de l’application. Inscrivez un chiffre (0, par exemple) puis enfoncez la touche Entrée pour voir les films recommandés. Au lieu d’afficher les informations sur l’utilisateur, le programme propose quelques longs métrages que celui-ci a regardés et notés antérieurement.

Pour sortir du contenant trtclient sans le fermer, enfoncez les touches CTRL-p CTRL-q. Il demeurera ouvert afin que vous puissiez vous en resservir plus tard.

Clôture

Quand vous aurez fini d’explorer la Solution type, fermez l’application pour libérer les ressources de la GPU afin que les autres participants de l’ATIR puissent s’en servir.

Allez à Projects > Orchestration > Stacks, sélectionnez la pile correspondante et cliquez Delete Stacks, en haut (voir la figure ci-dessou). De cette façon, vous supprimerez la pile et l’instance de la GPU qui y est associée. Cela devrait vous prendre moins d’une minute.

Considérations d’ordre technique

Cette partie décrit ce qu’il faut prendre en compte quand on utilise ou adapte la Solution type.

Déploiement

La Solution type est déployée sur un serveur d’inférence TensorRT, mais le modèle TensorFlow pourrait être employé directement dans un environnement de production sans exportation du modèle ni exploitation d’un tel serveur. TensorRT est généralement plus efficace avec une unité de traitement graphique (GPU) et établit des prévisions plus vite que les solutions de rechange.

Dans la Solution type, l’application cliente et le serveur d’inférence se trouvent sur le même hôte, pour plus de simplicité. Cependant, il est plus courant d’utiliser des hôtes différents, ce qui nécessitera l’ouverture des ports correspondants afin qu’ils communiquent entre eux.

Solutions de rechange

Plutôt que TensorFlow, on pourrait bâtir et former le modèle avec PyTorch, autre cadre populaire d’apprentissage machine reposant sur Python et compatible avec le serveur d’inférence TensorRT. Vous trouverez sur Internet de nombreuses analyses comparant l’un et l’autre. En voici quelques-unes : Awni Hannin: PyTorch or TensorFlow?TensorFlow or PyTorch: The Force is Strong with Which One?PyTorch vs. TensorFlow — Spotting the Difference et The Battle: TensorFlow vs Pytorch.

Architecture des données

La Solution type repose sur un jeu de données constitué, dans ce cas, d’un simple fichier texte. Plusieurs points doivent être pris en considération eu égard aux données, aux éléments du code qui en dépendent, à la façon de l’élargir et aux pratiques exemplaires.

Les deux composants principaux qui exploitent directement le jeu de données sont le pipeline qui met dernières en mémoire pour former le modèle et l’application cliente qui formule les prévisions (titres de films). Ces composants devront être modifiés si on change l’architecture des données. Par exemple, on pourrait stocker les informations dans une base de données qui, soit serait versée dans un fichier avant que le pipeline actuel le traite, soit à laquelle le code puiserait directement. Le code de l’application cliente, par exemple, pourrait verser les données d’un fichier ou d’une base de données dans un tableau de hachage ou consulter la base de données à chaque demande.

Pour enrichir les données avec de nouveaux utilisateurs ou longs métrage, on devra former le modèle à nouveau. Dans un environnement de production, la solution prévoirait un recyclage périodique du modèle et ne proposerait de recommandations personnalisées qu’après fois que l’utilisateur aura recouru assez souvent au système pour que celui-ci ait accumulé les données requises. Habituellement, les projets de ce genre proposent des recommandations générales sur des thèmes populaires avant de passer à des recommandations plus personnalisées.

Enfin, puisque les données pourraient incorporer des renseignements personnels sur l’utilisateur, le développeur qui crée une solution similaire devra respecter les pratiques en usage sur la gestion des données sensibles. Le module de formation, par exemple, n’a besoin que de l’identifiant, pas du nom de l’utilisateur ni d’autres renseignements. Cependant, pour formuler les prévisions, l’application devra pouvoir déterminer de quel utilisateur il s’agit (ouverture d’une séance, par exemple), lui attribuer une identité et en faire de même avec les longs métrages. On appliquera donc les pratiques reconnues par l’industrie aux composants qui recueillent les données des utilisateurs, les emmagasinent, s’en servent pour former le modèle et puisent dans les données pour convertir l’identifiant en texte ordinaire.

Sécurité

Après déploiement, il existe un léger risque que des gens mal intentionnés accèdent à l’environnement de la Solution type pour la modifier et organiser une cyberattaque (par déni de service notamment). On atténuera ce risque en épousant les pratiques exemplaires de l’ATIR concernant le déploiement de scripts, c’est-à-dire :

  • établir des règles qui interdisent l’accès à tous les ports, sauf le port 22 du SSH de l’instance qui a été déployée, dans le pare-feu;
  • contrôler les accès afin que seuls les participants de l’ATIR puissent déployer et utiliser une instance de la Solution type après authentification.

Pour diminuer encore plus les risques, on suivra les recommandations que voici :

  • utiliser les contrôles de sécurité qui ont été déployés sans les modifier;
  • une fois qu’on en a fini avec la solution de référence, la supprimer comme on l’a expliqué plus haut (section « clôture »).

Employée de façon autonome, la Solution type ne consomme pas directement les ressources du réseau ni des installations de stockage en cours d’exécution. Aucune procédure n’est donc nécessaire pour réguler ces ressources.

Réseau

Les clients peuvent consulter le serveur d’inférence au moyen des protocoles HTTP ou gRPC (Google Remote Procedure Call). Il n’y a aucune autre considération spécifique au réseau.

Mise à l’échelle

La Solution type utilise un modèle passif. En d’autres termes, le même modèle peut être déployé sur de nombreux serveurs d’inférence, ce qui permet d’implanter une architecture standard très évolutive qui acceptera de multiples demandes parallèles et un équilibreur qui répartira la charge entre les serveurs.

Disponibilité

Le serveur d’inférence TensorRT incorpore une API qui veille à ce que le serveur puisse répondre aux demandes d’inférence. Il est donc possible d’ajouter le serveur comme un hôte ordinaire dans une architecture axée sur une forte disponibilité et de pointer l’équilibreur sur l’API du serveur pour qu’il bloque les demandes, change d’hôte ou en démarre un nouveau quand l’intensité des activités sur le serveur le justifie.

Interface utilisateur (IU)

L’interface de la Solution type se résume à une ligne de commande qui met en relief le programme en arrière-plan. L’IU variera en fonction de l’usage qu’on en fait, mais cela déborde du propos de notre exemple.

API

L’interface du protocole d’application est en code Python ordinaire. Elle est structurée de façon modulaire et est accompagnée de commentaires explicites. Le développeur pourra s’en inspirer pour créer une solution sur mesure.

Coût

La solution n’exige qu’une instance de GPU dans l’ATIR, ce qui équivaut à environ 100 $ par mois dans un nuage public.

Licence d’exploitation

Toutes les bibliothèques utilisées par la Solution type sont de source ouverte. Il en va autant pour le code du Recommandeur de films. Le jeu de données MovieLens peut être utilisé à des fins non lucratives sous certaines conditions. Voir les informations concernant les licences d’exploitation ci-dessous. Vous devrez vous conformer aux dispositions des différentes licences avant d’exploiter, de modifier, d’élargir ou de diffuser l’un ou l’autre composant de la Solution type.

CODE SOURCE

On trouvera le code source de la Solution type ici. Veuillez lire le fichier README.md pour savoir comment le cloner et utiliser le dépôt de données.

Glossaire

Expression Description
API Interface de protocole d’application
Apprentissage profond Méthode d’apprentissage machine faisant appel aux réseaux neuronaux
ATIR Accélérateur technologique pour la recherche et l’innovation. Se rapporte au projet pilote lancé à l’automne 2019.
CUDA Compute Unified Device ArchitectureModèle de programmation et plateforme de calcul en parallèle de NVIDIA
Filtrage collaboratif Technique employée par les systèmes de recommandation pour prévoir automatiquement ce qui pourrait intéresser l’utilisateur après avoir recueilli des données sur les goûts ou les préférences d’autres utilisateurs (collaborateurs).
GPU Unité de traitement graphique. Dispositif autorisant un traitement ultra performant des données en parallèle
IU
Interface utilisateur
Système de recommandation ou recommandeur Modèle d’apprentissage machine qui prévoit la « note » qu’un utilisateur attribuera à un article ou ses « préférences ». Il suggère des articles pertinents à l’utilisateur.