Taboola: Optimierung der Content-Recommendation-Engine

Taboola erzielt stärkere Leistung für TensorFlow*-Framework, indem Deep Learning für Rückschlüsse auf Besucherpräferenzen eingesetzt wird.

Auf einen Blick:

  • Taboola ist die weltweit größte Content-Recommendation-Engine. Sie liefert über einer Milliarde Personen jeden Monat maßgeschneiderte Empfehlungen.

  • Um die Leistung zu steigern, ohne die Infrastrukturausmaße zu vergrößern, tat sich Taboola mit Intel® Software-Technikern zusammen, um den Code für die skalierbare Intel® Xeon® Prozessorreihe zu optimieren.

author-image

Von

Als eine der weltweit führenden Content-Discovery-Plattformen und Teilnehmer an Intel® AI Builders liefert Tabola über einer Milliarde einzelner Internet-Nutzer jeden Monat maßgeschneiderte Empfehlungen, die ihnen dabei helfen, das zu entdecken, was auf den Websites von Content-Herausgebern, in Mobil-Apps und in anderen digitalen Formaten gerade neu oder von Interesse ist. Im Laufe des letzten Jahrzehnts haben Tausende von Herausgebern und Werbetreibende wie CBS Interactive, Euronews, Pandora und Samsung1 Partnerschaften mit Taboola geschlossen, um ihr Publikum zu vergrößern, Interaktionen zu intensivieren und den Umsatz zu steigern. Taboolas proprietäre Deep-Learning-Algorithmen, die auf einem der größten Datenpools für Verhaltensweisen beim Content-Konsum offenen Internet basieren, verbinden Menschen mit Inhalten, die für sie zu Zeitpunkten, zu denen sie für Neues am offensten sind, am wichtigsten sind.

Taboola liefert Online-Nutzern Content-Empfehlungen mithilfe einer Lösung, die auf künstlicher Intelligenz (KI) basiert und die Vorlieben jedes Besuchers im Rahmen des jeweiligen Besuchs voraussagt. Von jedem Website-Besucher wird eine Reihe von Daten in Echtzeit übernommen. Die KI-Lösung verarbeitet diese Daten und berücksichtigt dabei sowohl einfache Faktoren, wie die Tageszeit und kürzlich betrachtete Inhalte, sowie komplexere Faktoren, wie den Kontext und im Trend liegende Themen. Die Genauigkeit der Empfehlungen – in Verbindung mit der Einfachheit und Effizienz der Lösung – hat den globalen Erfolg Taboolas gesteigert und hilft einigen der innovativsten und am häufigsten besuchten digitalen Formate, die Benutzerinteraktionen zu steigern, den Besucherverkehr in bare Münze umzusetzen und ein hochwertiges Publikum zu gewinnen.

Das Pontenzial der KI

Im Herzen der Taboola-Lösung befindet sich ein neuronales Netzwerk, das auf dem Open-Source-Framework TensorFlow* basiert, welches Deep-Learning nutzt, um Rückschlüsse auf die Vorlieben von Besuchern zu ziehen. Diese KI-basierte Strategie ist ein entscheidender Faktor, um die Anforderungen an Geschwindigkeit und Genauigkeit zu erfüllen und gleichzeitig eine Vielzahl von Daten für jeden Website-Besucher zu analysieren. Zudem sorgt sie dafür, dass die Taboola-KI-Algorithmen weiterhin von neuen Datenquellen und der Art und Weise, wie einzelne Konsumenten auf die Empfehlungen reagieren, lernen können. Der selbstlernende Mechanismus der KI fördert kontinuierliche Verbesserungen der Empfehlungsgenauigkeit, ohne komplexe, manuelle Programmierarbeit zu erfordern.

Eine neue Dimension des Leistungsvermögens – auf bestehender Hardware

Damit Taboola seinen Empfehlungsservice weltweit anbieten kann, betreibt das Unternehmen rund um den Globus sieben Rechenzentren. Während das Unternehmen seine Online-Präsenz weiter ausbaut und die Genauigkeit der Recommendation-Engine weiterentwickelt, benötigt es beständige Steigerungen der Leistung und Kapazität seiner Recheninfrastruktur. Ein vor Kurzem durchgeführtes Upgrade auf Server, die auf dem neuesten Intel® Xeon® Platinum 8168 Prozessor basieren, lieferte eine 1,49-fache Leistungssteigerung für das neuronale Netz (weitere Einzelheiten siehe Intel Lösungsbeschreibung: Taboola optimiert künstliche Intelligenz für intelligentere Content-Empfehlungen). Angesichts des schnellen Wachstums der Workload-Anforderungen wurde sogar noch mehr Leistung benötigt.

Um die Leistung zu steigern, ohne die Infrastrukturausmaße zu vergrößern, tat sich Taboola mit Intel Software-Technikern zusammen, um den Code des Unternehmens zu optimieren. Die Software-Optimierung wurde innerhalb weniger Wochen durchgeführt und brachte eine 2,5-fache2 Leistungssteigerung im Vergleich zum nicht optimierten Originalcode. Taboola nutzt diese Leistungsgewinne, um bei höherer Geschwindigkeit mehr und bessere Empfehlungen zu liefern. Mit über 10.000-Servern in mehreren Rechenzentren sind die Vorteile im Bereich der Kosteneinsparungen, der Effizienz und des Wachstumspotenzials beträchtlich.

Der Software-Optimierungsprozess

Taboolas KI-Lösung nutzt das TensorFlow-Serving*-Framework (TFS). Dieser Open-Source-Deployment-Service ist dafür ausgelegt, Machine-Learning-Modelle in Produktionsumgebungen auszuführen. TFS setzt als Komponente oberhalb von TensorFlow auf und nutzt für die Bereitstellung der Empfehlungen einen Client-Server-Workflow. Jeder TFS-Server hostet ein vortrainiertes Modell von Taboolas neuronalem Netz. Wenn der Server eine Vorhersageanfrage von einem Client (über gRPC) erhält, führt er die Client-Daten in einem Forward-Pass über das Modell aus und gibt das Ergebnis zurück.

Um die Leistung zu verbessern, optimierten Intel Ingenieure das TFS-Framework in drei Schritten. Jeder Schritt resultierte in deutlichen Leistungsgewinnen (Abbildung 1).

Abbildung 1: TFS-Leistungsgewinne: Leistungsvergleiche zwischen optimierten Versionen des TFS und der nicht optimierten Ausgangsversion.

Erster Schritt: Verwendung der Intel® Math Kernel Library for Deep Neural Networks (Intel® MKL-DNN), Leistungsvergleich mit Ausgangsversion: 1,15-fache Steigerung2
Beim Ausführen von Client-Daten über ein trainiertes KI-Modell werden Tensor/Matrix-Berechnungen intensiv eingesetzt. TFS nutzt im Allgemeinen die Open-Source-Template-Library Eigen* C++, um diese Operationen auszuführen. Auch wenn TFS selbst umfassend für die Intel® Architektur optimiert wurde, trifft dies auf Eigen nicht zu. Die Intel® Math Kernel Library for Deep Neural Networks (Intel® MKL-DNN) bietet für die Verarbeitung in neuronalen Netzen primitive Typen, die für die Bereitstellung hoher Leistung auf der neuesten Intel® Mikroarchitektur hochgradig optimiert sind. In der optimierten Testkonfiguration wurden standardmäßig primitive Funktionen der Intel MKL-DNN verwendet. Für Operationen, die derzeit in der Intel MKL-DNN nicht verfügbar sind, greift die optimierte Anwendung auf Eigen zurück.

Nach der Integration der Intel MKL-DNN wurden die nicht optimierte und optimierte Version des TFS auf demselben Zweiprozessorserver ausgeführt, der mit Intel® Xeon® Platinum 8180 Prozessoren konfiguriert ist. Die Erweiterung um die Intel MKL-DNN brachte eine 1,15-fache Leistungssteigerung2 im Vergleich zur nicht optimierten Version von TFS. Die Leistungsgewinne resultierten in erster Linie aus schnelleren Matrix-Matrix-Multiplikationsoperationen (SGEMM).

Zweiter Schritt: Pinning von Anwendungs-Threads und Arbeitsspeicher-Anfragen, Leistungsvergleich mit Ausgangsversion: 1,3-fache Steigerung2
Ein Zweiprozessorserver, der auf dem Intel Xeon Platinum 8180 Prozessor basiert, bietet 56 Kerne. Intel Ingenieure stellten fest, dass sich die Leistung durch das Hosting von zwei Instanzen auf pro TFS-Server und der effizienten Zuweisung von Prozessor- und Arbeitsspeicherressourcen zu jeder Instanz verbessern lässt. Um dies zu erreichen, hefteten sie die Anwendungs-Threads jeder TFS-Instanz an den entsprechenden Prozessor an. Den Pinnint-Ansatz nutzten sie auch für Arbeitsspeicheranforderungen jeder TFS-Instanz, die an die zugehörige NUMA-Domäne (Non-Uniform Memory Access) angeheftet wurden. Durch diese zusätzliche Optimierung konnte für die optimierte TFS-Version eine 1,3-fache Leistungssteigerung2 im Vergleich zur nicht optimierten Original-Version erzielt werden.

Dritter Schritt: Optimierung der Tensor-Operationen, Leistungsvergleich mit Ausgangsversion: 2,5-fache Steigerung2
Um die Leistung noch weiter zu steigern, nutzten Intel Ingenieure den Intel® VTune™ Amplifier, um Leistungsengpässe zu erkennen, indem sie während der Laufzeit der Anwendung Leistungsprofile erstellten. Mit dem Intel VTune Amplifier können Ingenieure den Anteil jedes Softwaremoduls an der gesamten Laufzeit der Anwendung visualisieren. Sie können auch einen genaueren Blick auf den Source-Code werfen und die Zeilen innerhalb dieser Module ermitteln, die sich auf die Leistung auswirken und gute Kandidaten für Optimierungsmaßnahmen sind. Es stellte sich heraus, dass die zeitaufwändigste Operation eine als Broadcasting bekannte Tensoroperation ist – was bei einer Anwendung mit dem Namen TensorFlow wohl kaum überrascht.
Ein Tensor ist ein n-dimensionales Zahlentupel. Eine Broadcast-Operation umfasst die Replizierung des Input-Tensors mit einem spezifizierten Faktor in einer bestimmten Dimension (Abbildung 2). Die Leistungsanalyse der Taboola-TFS-Lösung zeigte, dass eine Anforderung von einem einzelnen Client in rund 25.000 Tensor-Broadcast-Operationen resultiert, was einen Großteil der gesamten Verarbeitungszeit in Anspruch nimmt.

Abbildung 2: Beispiel für einen Tensor-Broadcast: Für einen 2x2-Tensor erfolgt ein Broadcast zu einem 6x4-Tensor, indem die erste und zweite Dimension jeweils mit dem Faktor 3 bzw. 2 repliziert wird.

Operationen wie Tensor-Broadcasting beinhalten die häufig wiederholte Ausführung eines Befehls über eine große Anzahl von Datenpunkten. Dies macht sie zu einem idealen Kandidaten für die SIMD-Funktion (Single Instruction / Multiple Data), die in Intel® Xeon® Prozessoren über die sogenannten Intel® Advanced Vector Extensions (Intel® AVX) integriert ist. Die neueste skalierbare Intel® Xeon® Prozessorreihe unterstützt die Intel® Advanced Vector Extensions 512 (Intel® AVX-512), mit denen eine einzelne Anweisung gleichzeitig für mehrere in Datenelementen, die in einem 512-bit-Vektorregister gespeichert sind, ausgeführt werden kann. Die Optimierung von Software für diese Strategie wird als Vektorisierung bezeichnet und kann die Leistung für Operationen, die sich auf diese Art parallelisieren lassen, immens steigern.

Wie die Analyse für den Intel VTune Amplifier zeigte, ist die Eigen-Implementierung des Tensor-Broadcasting sehr stark auf skalierbare Befehle angewiesen, die die Vorteile der Vektorverarbeitungsfunktion, die bei der skalierbaren Intel Xeon Prozessorreihe zur Verfügung steht, nicht nutzen. Die skalaren Befehle werden für die Berechnung des Zielindex im Input-Tensor verwendet, der angibt, wie die Elemente in den Output-Tensor kopiert werden. Das Technikerteam stellte zudem fest, dass die für einen Broadcast benötigte Anzahl an Indexberechnungen übermäßig groß ist, es sei denn, die Tensor-Dimensionen betragen ein Vielfaches der Breite der Vektorregister im Prozessor (für den FP32-Datentyp auf Prozessoren der skalierbaren Intel Xeon Prozessoreihe beträgt die Vektorregisterbreite 16).

Das für die Software-Optimierung zuständige Team vektorisierte die Tensor-Broadcastfunktionen in Eigen mithilfe der Intel AVX-512-Befehle. Im Rahmen der Optimierung erstellte das Technikerteam basierend auf den in Tabolas Anwendung ermittelten Input-Tensor-Typen zwei neue Tensor-Broadcastfunktionen: (packetNByOne) und (packetOneByN). Für beide Tensortypen konnte das Technikerteam die Anzahl der Operationen in einer typischen Broadcast-Operation deutlich reduzieren.

Abbildung 3: Tensor-Broadcast für 5x1-Tensor (packetNByOne-Klasse) zu 5x16-Tensor: Vergleich zwischen nicht optimierter Eigen*-Version (Grafik oben) und für Intel® Technik optimierter Eigen-Version (Grafik unten) Der nicht optimierte Code benötigte 80 separate Skalarberechnungen für die Broadcast-Operation, während beim optimierten Code nur 5 Operationen erforderlich waren.

Die folgenden Beispiele zeigen, wie die Operationen in repräsentativen Anwendungsfällen beschleunigt werden.

  • Broadcasting eines 5x1-Input-Tensors in einen 5x16-Output-Tensor
    (Abbildung 3): Bei Verwendung der nicht optimierten Version von Eigen waren 80 separate Skalarberechnungen erforderlich, und zwar eine Berechnung für jedes Tensorelement im Output-Tensor. Bei Verwendung der Intel AVX-512-Befehle in der optimierten Version von Eigen konnte dieselbe Operation mit gerade einmal fünf Berechnungen durchgeführt werden, und zwar einer Berechnung für jedes Element des Input-Tensors. Mit anderen Worten: Der optimierte Code reduziert die Anzahl der benötigten Berechnungen um den Faktor 16.

  • Broadcasting eines 1x20-Input-Tensors in einen 5x20-Output-Tensor
    (Abbildung 4): Diese Operation ist komplizierter, da die 20 Elemente des Output-Tensors nicht reibungslos zu den 512-bit-Vektorregistern der skalierbaren Intel Xeon Prozessorreihe passen (20 Elemente mal 32 bit pro Element ergeben 640 bit). In diesem Fall nutzt die Ausgangsversion von Eigen die Vorteile einiger SIMD-Funktionen, ist aber immer noch auf 52 skalare Operationen angewiesen. Der optimierte Code führt die gleiche Operation ohne skalare Operationen durch, was die Gesamtanzahl der benötigten Berechnungen deutlich verringert.

Abbildung 4: Tensor-Broadcast für 1x20-Tensor (packetOneByN-Klasse) zu 5x20-Tensor: Vergleich zwischen nicht optimierter Eigen*-Version (Grafik oben) und für Intel® Technik optimierter Eigen-Version (Grafik unten) Auch wenn die Optimierung nicht so eindrucksvoll ist wie bei dem Beispiel in Abbildung 3, ersetzt die optimierte Version 52 skalare Operationen durch deutlich effizientere SIMD-Operationen.

Bevor das Team die Auswirkungen der verbesserten Vektorisierung auf die TFS-Leistung testeten, führte es einen Benchmark-Test für den Tensor-Broadcast mit Eigen unabhängig von TFS durch, indem Eigen auf einem einzelnen Kern des Intel Xeon Platinum 8180 Prozessors ausgeführt wurde. Für den Nx1-Typ des Input-Tensors (packetNByOne-Klasse) betrug die Beschleunigung das 58-bis 65-fache2, beim 1xN-Typ der Input-Tensoren (packetOneByN-Klasse) lag der Geschwindigkeitszuwachs im 3- bis 4-fachen Bereich2 (Abbildung 5).

Tensor-Broadcast

Abbildung 5: Leistungsgewinne für Eigen*: Leistungsvergleich von Tensor-Broadcast-Operationen mit und ohne Optimierungen für Intel® Technik (geringerer Wert ist besser). Die 58- bis 65-fachem Leistungsgewinne3 in der Grafik oben beziehen sich auf packetNByOne-Input-Tensoren; und die 3- bis 4-fachen Leistungsgewinne 3 in der Grafik unten beziehen sich auf packetOneByN-Input-Tensoren.

Am Ende führte das Team einen Leistungsvergleich zwischen der optimierten und der nicht optimierten TFS-Version durch. Hierfür wurden alle drei Optimierungen verwendet: 1) Intel MKL-DNN; 2) zwei Instanzen von TFS für CPU- und NUMA-Pinning und 3) vektorisierte Tensor-Broadcast-Operationen. Mit allen drei Verbesserungen erzielte der optimierte Code eine 2,5-fache Leistungssteigerung2 im Vergleich zur nicht optimierten Original-Version (Abbildung 1).

Starke Leistung für künftige KI-Lösungen ist bereits integriert

So wie bei vielen Software-Optimierungen, an denen Intel beteiligt ist, bietet auch die Arbeit mit Taboola potenziellen Nutzen für eine viel breitere Community. Um neue KI-Nutzer besser zu unterstützen, verallgemeinerte Intel zuerst die Tensor-Broadcast-Optimierungen, um für Tensoren jeder Dimension geeignet zu sein, und implementierte die Code-Verbesserungen anschließend in der öffentlichen Distribution von Eigen. Der optimierte Code wird in Version 1.10 von TensorFlow-Serving enthalten sein. Infolgedessen werden künftige Eigen- und TFS-Nutzer von deutlich schnellerem Tensor-Broadcasting profitieren, wenn sie ihre Anwendungen auf der skalierbaren Intel Xeon Prozessorreihe oder auf den vielen anderen Intel® Prozessoren, die Intel AVX, Intel® Advanced Vector Extensions 2 (Intel® AVX2) und Intel AVX-512 unterstützen, ausführen.

Ein skalierbarer Pfad für KI-Entwickler

Die Erweiterung von Software um SIMD-Funktionalität ist ein entscheidender Faktor für die Optimierung der Leistung auf modernen Prozessoren. Die für die Optimierung von TFS und Eigen verwendeten Techniken können auf viele andere Software-Codes angewendet werden und liefern möglicherweise erhebliche Leistungsgewinne für ein breites Spektrum von Anwendungen, die auf Plattformen mit Intel Prozessoren laufen. Bei den allgemeinhin für neuronale Netze verwendeten primitiven Funktionen können KI-Entwickler darauf zählen, dass die Intel MKL-DNN auf Intel Prozessoren optimale Leistung erzielt. Die Identifizierung und Optimierung der zeitraubendsten Codesegmente ist ein iterativer Prozess, der den Weg bereitet, um sowohl auf aktuellen als auch auf künftigen Hardware-Plattformen sogar noch stärkere Leistung bereitzustellen.

Fazit

Taboola ist weltweit rasant gewachsen, indem das Unternehmen Einzelpersonen gezielt Marken und redaktionelle Inhalte aus dem gesamten öffentlich verfügbaren Internet empfiehlt, die für sie von Interesse oder Relevanz sein könnten. Sowohl Geschwindigkeit als auch Genauigkeit sind für den Erfolg von Taboolas Content-Discovery-Plattform entscheidend, und ein hochoptimiertes KI-Framework auf Intel Architektur macht es einfacher, diese Ziele zu erreichen, ohne enorme Summen in Hardware-Infrastruktur zu investieren.

Intel wird auch weiterhin mit jeder neuen Prozessorgeneration Hardware-Optimierungen bereitstellen und mit Open-Source-Communitys und kommerziellen Organisationen zusammenarbeiten, um das volle Potenzial der Leistungsvorteile in der Praxis zu entfalten. Bei neueren Prozessorgenerationen zielen viele dieser Fortschritte auf die hohen Verarbeitungsanforderungen von KI-Workloads ab. Indem Organisationen diese Fortschritte zu ihrem Vorteil nutzen, können sie heute einfacher KI-Lösungen entwickeln und hierfür ihre bestehende Infrastruktur verwenden. Mit diesem Ansatz können sie ihre Lösungen auch einfacher und kostengünstiger auf künftigen Prozessoren der skalierbaren Intel Xeon Prozessorreihe skalieren.

PDF herunterladen

Produkt- und Leistungsinformationen

1Informationen zu diesen und anderen Taboola-Praxisbeispielen finden Sie auf der Website von Taboola unter: https://www.taboola.com/resources/case-studies​​​​​​
2Die Leistungsergebnisse beruhen auf Tests von Taboola und Intel vom 6. August 2018 und spiegeln möglicherweise nicht alle öffentlich verfügbaren Sicherheitsupdates wider. Systemkonfiguration: Zweiprozessor-Server mit 2 Intel® Xeon® Platinum Prozessoren 8180 (2,50 GHz, 28 Kerne), 192 GB DDR4-2666MHz-Speicher (12 x 16-GB-DIMMs), Intel® SSD (SC2BX01) mit 1,5 TB, CentOS Linux* Release 7.5.1804 (Core) (3.10.0-862.9.1.el7.x86_64); Referenz-Software-Anwendung: TensorFlow-Serving r1.9 (https://github.com/tensorflow/serving​​​); für Intel optimierte Software-Anwendung: TensorFlow-Serving r1.9 + Intel MKL-DNN (​​​​​​https://mirror.bazel.build/github.com/intel/mkl-dnn/archive/0c1cf54b63732e5a723c5670f66f6dfb19b64d20.tar.gz​​​​​​) + Optimierungen (Verfügbarkeit der Optimierungen erwartet für TensorFlow-Serving Release 1.10).
3Die Leistungsergebnisse beruhen auf Tests von Taboola und Intel vom 6. August 2018 und spiegeln möglicherweise nicht alle öffentlich verfügbaren Sicherheitsupdates wider. Systemkonfiguration: Zweiprozessor-Server mit 2 Intel® Xeon® Platinum Prozessoren 8180 (2,50 GHz, 28 Kerne), 192 GB DDR4-2666MHz-Speicher (12 x 16-GB-DIMMs), Intel® SSD (SC2BX01) mit 1,5 TB, CentOS Linux* Release 7.5.1804 (Core) (3.10.0-862.9.1.el7.x86_64); Referenz-Software-Anwendung: TensorFlow-Serving r1.9 (https://github.com/tensorflow/serving​​​); für Intel optimierte Software-Anwendung: TensorFlow-Serving r1.9 + Intel MKL-DNN (​​​​​​https://mirror.bazel.build/github.com/intel/mkl-dnn/archive/0c1cf54b63732e5a723c5670f66f6dfb19b64d20.tar.gz​​​​​​) + Optimierungen (Verfügbarkeit der Optimierungen erwartet für TensorFlow-Serving Release 1.10).