Taboola : optimisation du moteur de recommandation de contenu

Taboola atteint des performances plus élevées pour le cadre TensorFlow* en utilisant l'apprentissage profond pour déduire les préférences des visiteurs.

En bref :

  • Taboola est le plus grand moteur de recommandation de contenu au monde, fournissant des recommandations personnalisées à plus d'un milliard de personnes uniques chaque mois.

  • Pour obtenir des performances plus élevées sans étendre l'empreinte de leur infrastructure, Taboola s'est engagé avec les ingénieurs logiciels Intel® pour optimiser leur code pour les processeurs Intel® Xeon® Scalable.

author-image

Par

Taboola, l'une des principales plateformes de découverte au monde, est membre d'Intel® AI Builders et fournit chaque mois des recommandations personnalisées à plus d'un milliard d'internautes pour les aider à explorer ce qui est intéressant et nouveau sur les sites d'éditeurs, les applications mobiles et autres propriétés numériques. Au cours de la dernière décennie, des milliers d'éditeurs et d'annonceurs dont CBS Interactive, Euronews, Pandora et Samsung1 ont établi un partenariat avec Taboola pour augmenter l'audience, augmenter l'engagement et générer des revenus. Les algorithmes d'apprentissage en profondeur exclusifs de Taboola, alimentés par l'un des plus grands ensembles de données sur le comportement de consommation de contenu sur le Web ouvert, associent les personnes au contenu qui leur tient vraiment à cœur aux moments où elles sont les plus réceptives aux nouvelles choses.

Taboola fournit des recommandations de contenu aux utilisateurs en ligne à l'aide d'une solution basée sur l'intelligence artificielle (IA) qui prédit les préférences de chaque visiteur dans le contexte de chaque visite. Une variété de données sont ingérées en temps réel pour chaque visiteur du site Web. La solution d'IA traite ces données, en tenant compte à la fois de facteurs simples, tels que l'heure du jour et le contenu récemment consulté, et de facteurs plus complexes, tels que le contexte et les sujets tendances. La précision des recommandations, associée à la simplicité et à l'efficacité de la solution, a contribué au succès mondial de Taboola et aide certaines des propriétés numériques les plus innovantes et les plus visitées à accroître l'engagement des utilisateurs, à monétiser le trafic et à acquérir des audiences de qualité.

La puissance de l'IA

Le cœur de la solution Taboola est un réseau de neurones basé sur le framework open source TensorFlow* qui utilise l'apprentissage profond pour déduire les préférences des visiteurs. Cette stratégie basée sur l'IA est fondamentale pour répondre aux exigences de vitesse et de précision tout en analysant une variété de données pour chaque visiteur du site Web. Il garantit également que les algorithmes IA de Taboola peuvent continuer à apprendre des nouvelles sources de données et de la façon dont les consommateurs individuels répondent aux recommandations. La puissance d'auto-apprentissage de l'IA permet d'améliorer constamment la précision des recommandations, sans avoir besoin d'une programmation complexe et pratique.

Amener les performances vers de nouveaux sommets - sur le matériel existant

Pour fournir son service de recommandation à l'échelle mondiale, Taboola gère sept centres de données à travers le monde. Alors que la société continue d'étendre son empreinte en ligne et de faire évoluer la précision de son moteur de recommandation, elle a besoin d'augmenter régulièrement la puissance et la capacité de son infrastructure informatique. Une récente mise à niveau des serveurs basée sur le dernier processeur Intel® Xeon® Platinum 8168 a fourni une augmentation de 1,49 X des performances du réseau neuronal (pour plus de détails, voir la présentation de la solution Intel : Taboola optimise l'intelligence artificielle pour des recommandations de contenu plus intelligentes). Compte tenu de la croissance rapide de la charge de travail, des performances encore plus importantes étaient nécessaires.

Pour obtenir des performances plus élevées sans étendre l'empreinte de leur infrastructure, Taboola s'est engagé avec les ingénieurs logiciels d'Intel pour optimiser leur code. L'optimisation logicielle a été achevée en quelques semaines seulement, ce qui donne un résultat 2,5X2 amélioration des performances par rapport au code original non optimisé. Taboola utilise ces gains de performances pour fournir de meilleures recommandations plus nombreuses à des vitesses plus élevées. Avec plus de dix mille serveurs répartis sur plusieurs centres de données, les avantages en termes d'économies de coûts, d'efficacité et de potentiel de croissance sont considérables.

Processus d'optimisation de logiciel

La solution Taboola AI utilise le cadre TensorFlow-Serving * (TFS), qui est un service de déploiement open source pour exécuter des modèles d'apprentissage automatique dans des environnements de production. Le TFS est construit sur TensorFlow et utilise un flux de travail client-serveur pour fournir des recommandations. Chaque serveur TFS héberge un modèle pré-formé du réseau neuronal Taboola. Lorsque le serveur reçoit une demande de prédiction d'un client (via gRPC), il exécute les données client dans un transfert direct à travers le modèle et renvoie le résultat.

Pour améliorer les performances, les ingénieurs d'Intel ont optimisé le TFS en trois étapes. Chaque étape a fourni des gains de performances significatifs (figure 1).

Figure 1. Gains de performances TFS : comparaisons de performances pour les versions optimisées de TFS par rapport à la version de base non optimisée.

Première étape : utiliser la bibliothèque Intel® Math Kernel pour les réseaux de neurones profonds(Intel® MKL-DNN) Performance versus ligne de référence : 1.15X2.
Les calculs de tenseur/matrice sont largement utilisés pour exécuter les données client via un modèle d'IA formé. Le TFS s'appuie généralement sur la bibliothèque de modèles open source Eigen* C++ pour effectuer ces opérations. Bien que le TFS lui-même ait été hautement optimisé pour l'architecture Intel®, Eigen ne l'a pas été. La bibliothèque Intel® Math Kernel pour les réseaux de neurones profonds (Intel® MKL-DNN) fournit des primitives pour le traitement des réseaux de neurones qui sont toutes hautement optimisées pour les performances sur la dernière microarchitecture Intel®. Dans la configuration de test optimisée, les primitives Intel MKL-DNN étaient utilisées par défaut. Pour les opérations qui ne sont actuellement pas disponibles dans Intel MKL-DNN, l'application optimisée revient à Eigen.

Après l'intégration de Intel MKL-DNN, les versions non optimisées et optimisées de TFS ont été exécutées sur le même serveur à deux connecteurs configuré avec les processeurs Intel® Xeon® Platinum 8180. L'ajout de la bibliothèque Intel MKL-DNN a fourni 1.15X 2 les performances de la version non-optimisée du TFS. Les gains de performances résultent principalement d'opérations de multiplication matrice-matrice plus rapides (SGEMM).

Étape 2 : épingler les threads d'application et les demandes de mémoire par rapport aux performances de la ligne de référence: 1,3X 2.
Un serveur à deux sockets basé sur le processeur Intel Xeon Platinum 8180 fournit 56 cœurs. Les ingénieurs Intel ont constaté que l'hébergement de deux instances de TFS par serveur et l'allocation efficace des ressources de processeur et de mémoire à chaque instance amélioraient les performances. Pour ce faire, ils ont épinglé les threads d'application de chaque instance de TFS à un socket de processeur correspondant. Ils ont également épinglé les demandes de mémoire provenant de chaque instance TFS au domaine de mémoire d'accès à la mémoire non uniforme (NUMA) associé. Avec cette optimisation supplémentaire, les performances de la version TFS optimisée sont passées à 1,3 X2 les performances de la version originale non-optimisée.

Étape 3 : Optimiser les performances des opérations du tenseur par rapport à la ligne de référence : 2,5 X2.
Pour faire passer les performances au niveau supérieur, les ingénieurs Intel ont utilisé Intel® VTune™ Amplifier pour identifier les goulots d'étranglement des performances en profilant l'application pendant l'exécution. Avec Intel VTune Amplifier, les ingénieurs peuvent visualiser la contribution de chaque module logiciel à l'exécution globale de l'application. Ils peuvent également regarder de plus près pour identifier les lignes précises de code source au sein des modules qui nuisent aux performances et sont de bons candidats pour l'optimisation. Sans surprise pour une application appelée TensorFlow, l'opération la plus longue s'est avérée être une opération tensorielle appelée diffusion.
Un tenseur est un tableau de nombres à n dimensions. Une opération de diffusion implique la réplication du tenseur d'entrée par un facteur spécifié sur n'importe quelle dimension donnée (figure 2). L'analyse des performances de la solution Taboola TFS a montré qu'une demande émanant d'un seul client entraînait environ 25 000 opérations de diffusion de tenseurs, ce qui consommait une grande partie du temps de traitement total.

Figure 2. Exemple de diffusion d'un tenseur : un tenseur 2x2 est diffusé vers un tenseur 6x4 en reproduisant les première et deuxième dimensions respectivement par un facteur 3 et 2.

Des opérations telles que la diffusion tensorielle impliquent d'exécuter plusieurs fois une instruction sur un grand nombre de points de données. Cela les rend parfaitement adaptées aux capacités SIMD (Single Instruction Multiple Data) intégrées aux processeurs Intel® Xeon® grâce à une technologie appelée Intel® Advanced Vector Extensions (Intel® AVX). Les derniers processeurs Intel® Xeon® Scalable supportent Intel® Advanced Vector Extensions 512 (Intel® AVX-512), qui permet d'exécuter simultanément une seule instruction sur plusieurs éléments de données stockés dans un registre vectoriel de 512 bits. L'optimisation des logiciels pour cette stratégie est connue sous le nom de vectorisation et peut considérablement augmenter les performances des opérations qui peuvent être parallélisées de cette manière.

Comme l'a révélé l'analyse de l'amplificateur Intel VTune, la mise en œuvre Eigen de la diffusion par tenseur repose fortement sur des instructions scalaires qui ne tirent pas parti des capacités de traitement vectoriel disponibles dans les processeurs Intel Xeon Scalable. Les instructions scalaires sont utilisées pour calculer l'indice cible dans le tenseur d'entrée, qui spécifie comment les éléments sont copiés dans le tenseur de sortie. L'équipe d'ingénieurs a également constaté que le nombre de calculs d'index requis pour une diffusion est excessif, sauf si les dimensions des tenseurs sont un multiple de la largeur des registres vectoriels du processeur (la largeur des registres vectoriels est de 16 pour un type de données FP32 sur les processeurs Intel Xeon Scalable).

L'équipe d'optimisation du logiciel a vectorisé les fonctions de diffusion du tenseur à Eigen en utilisant les instructions de Intel AVX-512. Dans le cadre de l'effort d'optimisation, l'équipe d'ingénieurs a créé deux nouvelles fonctions de membres de diffusion de tenseurs basées sur les types de tenseurs d'entrée identifiés dans l'application Taboola : (packetNByOne) et (packetOneByN). Pour les deux types de tenseurs, l'équipe d'ingénieurs a pu réduire considérablement le nombre d'opérations dans une opération de diffusion typique.

Figure 3. Comparaison de la diffusion d'un tenseur 5x1 (classe PacketNByOne) dans un tenseur 5x16 en utilisant Eigen* non optimisé (graphique du haut) et Eigen optimisé Intel® (graphique du bas). Le code non optimisé nécessite 80 calculs scalaires distincts pour l'opération de diffusion contre seulement 5 opérations pour le code optimisé.

Les exemples suivants montrent comment les opérations sont accélérées dans des cas représentatifs.

  • Diffusion d'un tenseur d'entrée 5x1 dans un tenseur de sortie 5x16
    (Figure 3) : en utilisant un Eigen non optimisé, cette opération nécessite 80 calculs scalaires séparés, un calcul pour chaque membre du tenseur de sortie. En utilisant les instructions Intel AVX-512 dans la version optimisée d'Eigen, cette même opération peut être effectuée en utilisant seulement cinq calculs, un calcul pour chaque élément du tenseur d'entrée. En d'autres termes, le code optimisé réduit le nombre de calculs requis d'un facteur 16.

  • Diffusion d'un tenseur d'entrée 1x20 dans un tenseur de sortie 5x20
    (Figure 4) : Cette opération est plus compliquée parce que les 20 éléments du tenseur de sortie ne s'inscrivent pas de manière égale dans les registres vectoriels de 512 bits des processeurs Intel Xeon Scalable (20 éléments fois 32 bits par élément égalent 640 bits). Dans ce cas, la version Eigen de base tire parti de certaines fonctionnalités du SIMD, mais repose toujours sur 52 opérations scalaires. Le code optimisé effectue la même opération sans opérations scalaires, ce qui réduit considérablement le nombre total de calculs nécessaires.

Figure 4. Comparaison de la diffusion d'un tenseur d'entrée 1x20 (classe packetOneByN) dans un tenseur de sortie 5x20 en utilisant Eigen* non optimisé (graphique du haut) et en utilisant Eigen optimisé Intel® (graphique du bas). Bien qu'elle ne soit pas aussi rationalisée que l'exemple de la figure 3, la version optimisée remplace 52 opérations scalaires par des opérations SIMD beaucoup plus efficaces.

Avant de tester l'impact de l'amélioration de la vectorisation sur les performances du TFS, l'équipe a comparé la diffusion du tenseur Eigen indépendamment du TFS en faisant tourner Eigen sur un seul cœur du processeur Intel Xeon Platinum 8180. Pour les tenseurs d'entrée de type Nx1 (classe packetNByOne), l'accélération était de 58-65X2 pour le type 1xN de tenseurs d'entrée (classe packetOneByN), l'accélération était de 3-4X2. (Figure 5).

Tenseur de diffusion

Figure 5. Gains de performance Eigen* : comparaison des performances des opérations de diffusion des tenseurs avec et sans optimisations Intel® (moins c'est mieux). Les résultats 58-65X3 les gains de performances indiqués dans le graphique supérieur sont applicables aux tenseurs d'entrée packetNByOne; les résultats 3-4X3 les gains indiqués dans le graphique inférieur sont applicables aux tenseurs d'entrée packetOneByN.

Enfin, l'équipe a comparé les performances des versions optimisées et non optimisées de TFS. Les trois optimisations ont été utilisées : 1) Intel MKL-DNN; 2) deux instances de TFS avec épinglage CPU et NUMA ; 3) des opérations de diffusion de tenseur vectorisées. Grâce aux trois améliorations, les performances du code optimisé étaient de 2,5x2 celle du code original, non-optimisé (Figure 1).

Haute performance intégrée pour les futures solutions d'IA

Comme dans de nombreux engagements d'optimisation de logiciels Intel, le travail effectué avec Taboola offre une valeur potentielle pour une communauté beaucoup plus large. Pour mieux prendre en charge les utilisateurs d'IA émergents, Intel a généralisé les optimisations de diffusion du tenseur pour prendre en charge les tenseurs de toutes dimensions, puis a actualisé les améliorations du code pour la distribution publique d'Eigen. Le code optimisé sera inclus dans la version 1.10 de TensorFlow-Serving. En conséquence, les futurs utilisateurs d'Eigen et de TFS bénéficieront d'une diffusion de tenseur beaucoup plus rapide lorsqu'ils exécuteront leurs applications sur des processeurs Intel Xeon Scalable ou sur les nombreux autres processeurs Intel® prenant en charge Intel AVX, Intel® Advanced Vector Extensions 2 (Intel® AVX2) et Intel AVX-512.

Une voie évolutive pour les développeurs d'IA

L'ajout de capacités SIMD aux logiciels est fondamental pour optimiser les performances des processeurs modernes. Les techniques utilisées pour optimiser TFS et Eigen peuvent être appliquées à de nombreux autres codes logiciels et peuvent potentiellement générer des gains de performances majeurs pour une large gamme d'applications fonctionnant sur des plateformes à processeur Intel. Pour les primitives de réseau neuronal couramment utilisées, les développeurs d'IA peuvent compter sur Intel MKL-DNN pour obtenir les performances optimales sur les processeurs Intel. L'identification et l'optimisation des segments de code les plus chronophages est un processus itératif qui offre un moyen de libérer des performances encore plus élevées sur les plateformes matérielles actuelles et futures.

Conclusion

Taboola a connu une croissance mondiale rapide en associant des individus à des contenus de marque et éditoriaux intéressants et pertinents pour eux sur le Web ouvert. La vitesse et la précision sont fondamentales pour le succès de la plateforme de découverte de Taboola, et un cadre d'IA hautement optimisé sur l'architecture Intel facilite la réalisation de ces objectifs sans dépenser trop en infrastructure matérielle.

Intel continue de proposer de nouvelles optimisations matérielles à chaque nouvelle génération de processeur et collabore à la fois avec les communautés open source et les organisations commerciales pour aider à tirer pleinement parti des avantages de performances dans les déploiements réels. Dans les dernières générations de processeurs, bon nombre de ces avancées ont ciblé les lourdes demandes de traitement des charges de travail de l'IA. Les organisations peuvent tirer parti de ces avancées pour construire de meilleures solutions d'IA aujourd'hui en utilisant leur infrastructure existante. Il peut également les aider à faire évoluer leurs solutions plus facilement et à moindre coût sur les futurs processeurs Intel Xeon Scalable.

Télécharger le PDF

Infos sur le produit et ses performances

2Les résultats des performances sont basés sur les tests Taboola et Intel au 6 août 2018 et peuvent ne pas refléter toutes les mises à jour de sécurité disponibles publiquement. Configuration du système : serveur à deux sockets configuré avec 2 processeurs Intel® Xeon® Platinum 8180 (2,50 GHz, 28 cœurs), 192 Go de mémoire DDR4@2666MHz (12 x 16 Go DIMMS), 1,5 To Intel® SSD (SC2BX01), CentOS Linux* version 7.5.1804 (Core) (3.10.0-862.9.1.el7.x86_64) ; application logicielle de ligne de référence : TensorFlow-Serving r1.9 (https://github.com/tensorflow/serving) ; application logicielle Intel optimisée : TensorFlow-Serving r1.9 + Intel MKL-DNN (https://mirror.bazel.build/github.com/intel/mkl-dnn/archive/0c1cf54b63732e5a723c5670f66f6dfb19b64d20.tar.gz) + optimisations (disponibilité des optimisations prévues dans la version 1.10 de TensorFlow-Serving)
3Les résultats des performances sont basés sur les tests Taboola et Intel au 6 août 2018 et peuvent ne pas refléter toutes les mises à jour de sécurité disponibles publiquement. Configuration du système : serveur à deux sockets configuré avec 2 processeurs Intel® Xeon® Platinum 8180 (2,50 GHz, 28 cœurs), 192 Go de mémoire DDR4@2666MHz (12 x 16 Go DIMMS), 1,5 To Intel® SSD (SC2BX01), CentOS Linux* version 7.5.1804 (Core) (3.10.0-862.9.1.el7.x86_64) ; application logicielle de ligne de référence : TensorFlow-Serving r1.9 (https://github.com/tensorflow/serving) ; application logicielle Intel optimisée : TensorFlow-Serving r1.9 + Intel MKL-DNN (https://mirror.bazel.build/github.com/intel/mkl-dnn/archive/0c1cf54b63732e5a723c5670f66f6dfb19b64d20.tar.gz) + optimisations (disponibilité des optimisations prévues dans la version 1.10 de TensorFlow-Serving)