L’apprentissage machine est une discipline complexe mais la mise en oeuvre des modèles est bien moins intimidante qu’auparavant grâce à des frameworks, tels que TensorFlow de Google, qui facilitent le processus d’acquisition des données, l’entraînement des modèles, la fourniture des prévisions et l’amélioration des résultats. TensorFlow est une bibliothèque open source conçue pour l’analyse numérique et l’apprentissage machine à grande échelle. Créée par l’équipe de Google Brain qui l’a livrée au public en 2015, elle rassemble de nombreux algorithmes et modèles d’apprentissage machine et de deep learning (réseaux neuronaux) qu’elle rend utilisables sous des formes programmatiques courantes. Elle utilise Python ou JavaScript pour fournir une API front-end pratique à utiliser pour bâtir des applications, ces dernières s’exécutant en C++ haute performance.

TensorFlow, qui vient concurrencer des frameworks tels que PyTorch et Apache MXNet, peut entraîner et exécuter des réseaux neuronaux profonds pour la classification de caractères manuscrits, la reconnaissance d’images, le plongement lexical (word embedding en anglais ), les réseaux neuronaux récurrents, modèles séquences à séquences (seq2seq) pour la traduction automatique, le traitement du langage naturel et les systèmes d'équation à dérivées partielles (PDE). Mieux encore, TensorFlow supporte les prévisions en production à grande échelle, avec les mêmes modèles qui ont été utilisés pour l’entraînement. Le framework dispose aussi d’une large bibliothèques de modèles pré-entraînés qui peuvent être utilisés dans les projets. On peut aussi se référer au code fourni dans le TensorFlow Model Garden comme exemple de bonnes pratiques pour entraîner ses propres modèles.

Comment fonctionne TensorFlow

TensorFlow permet aux développeurs de créer des graphes de flux de données (dataflow graphs), structures qui décrivent comment les données circulent au sein d’un graphe ou d’un ensemble de noeuds de traitement. Chaque noeud du graphe représente une opération mathématique et chaque connexion ou arête entre les noeuds est un tableau de données multidimensionnel ou tensor. Les applications TensorFlow s’exécutent sur tout type de cible : une machine locale, un cluster dans le cloud, des terminaux iOS et Android, sur des CPU ou des GPU. Lorsqu’on recourt aux services clouds de Google on peut bénéficier d’une accélération plus importante en exécutant TensorFlow sur ses processeurs spécialisés, les TPU (TensorFlow Processing Unit). Les modèles créés par TensorFlow peuvent être déployés sur la plupart des équipements où ils seront utilisés pour faire des prédictions.

La version 2.0 du framework a été livrée en octobre 2019. Sur de nombreux points, les remaniements qu’elle a apportée ont pris en compte les commentaires des utilisateurs, qui souhaitaient plus de facilité d’utilisation (par exemple, en se servant de l’API Keras, relativement simple, pour entraîner les modèles) et également plus de performances. L’entraînement distribué des modèles s’exécute plus facilement grâce à une nouvelle API et le support de TensorFlow Lite étend le nombre de plateformes sur lesquelles on peut déployer des modèles. Toutefois, pour tirer le meilleur parti des nouvelles fonctionnalités de TensorFlow 2.0, il faut réécrire le code créé pour les versions antérieures du framework, parfois légèrement, d’autres fois de façon significative. Un modèle entraîné peut être utilisé pour fournir des prédictions « as a service » via un container Docker utilisant des API Rest ou gRPC. Pour des scénarios de service de prédictions plus avancés, on peut recourir à Kubernetes.

Utiliser TensorFlow avec Python 

Toutes ces capacités sont fourni au programmeurs par le biais du langage Python. Facile à apprendre et à utiliser, ce dernier offre des moyens pratiques d’exprimer la façon dont les abstractions de haut niveau peuvent être couplées entre elles. TensorFlow est supporté par les versions 3.7 à 3.10 du langage. Le framework peut aussi fonctionner sur des versions antérieures de Python mais cela n’est pas garanti. Les noeuds et tenseurs dans TensorFlow sont des objets Python et les applications TensorFlow sont elles-mêmes des applications Python. Les opérations mathématiques proprement dites ne sont toutefois pas effectuées en Python. Les bibliothèques de transformations disponibles dans TensorFlow sont écrites sous forme de binaires C++ très performants. Python se contente de diriger le trafic entre les éléments et de fournir des abstractions de programmation de haut niveau pour les relier.

Le travail de haut niveau dans TensorFlow - création de nœuds et de niveaux et liaison entre eux - utilise la bibliothèque Keras. Cette API est simple en apparence ; un modèle de base à trois niveaux peut être défini en moins de 10 lignes de code, et le code d'apprentissage de ce modèle ne prend que quelques lignes de code supplémentaires. Mais si l’on souhaite « soulever le capot » pour effectuer un travail plus fin, par exemple en écrivant sa propre boucle d'apprentissage, il est possible de le faire.

Utiliser TensorFlow avec JavaScript 

Python est le langage le plus populaire pour travailler avec TensorFlow et l'apprentissage automatique en général. Mais JavaScript est désormais aussi un langage de première classe pour TensorFlow, et l'un de ses grands avantages est de pouvoir fonctionner partout où il y a un navigateur web. TensorFlow.js, comme on appelle la bibliothèque JavaScript TensorFlow, utilise l'API WebGL pour accélérer les calculs en s’appuyant les des GPU disponibles dans le système. Il est également possible d'utiliser un back-end WebAssembly pour l'exécution, et il est plus rapide que le back-end JavaScript ordinaire si on n'utilise qu'un CPU, bien qu'il soit préférable d'utiliser des GPU lorsque cela est possible. Des modèles préétablis permettent de se lancer dans des projets simples pour se donner une idée de la façon dont les choses fonctionnent. A ce sujet, un précédent article a expliqué comment utiliser TensorFlow dans un navigateur.

TensorFlow Lite

Les modèles TensorFlow entraînés peuvent également être déployés sur des équipements mobiles sous iOS et Android, ou situés en bout de réseau (edge). Le jeu d’outils TensorFlow Lite optimise les modèles pour qu'ils fonctionnent bien sur ces appareils, en permettant de faire des compromis entre la taille du modèle et la précision. Un modèle plus petit (c'est-à-dire 12 Mo contre 25 Mo, ou même plus de 100 Mo) est moins précis, mais la perte de précision est généralement faible et plus que compensée par la vitesse et l'efficacité énergétique du modèle. 

Pourquoi utiliser TensorFlow

L’aavantage le plus important du framework d’apprentissage machine est l'abstraction. Au lieu de s'occuper des détails de la mise en oeuvre d'algorithmes, ou de trouver des moyens appropriés pour relier la sortie d'une fonction à l'entrée d'une autre, le développeur peut se concentrer sur la logique globale de l'application. TensorFlow s'occupe des détails en coulisse. Il offre des commodités supplémentaires aux développeurs qui ont besoin de déboguer et d’explorer les applications TensorFlow. Chaque opération du graphe peut être évaluée et modifiée séparément et de manière transparente, au lieu de construire l'ensemble du graphe comme un seul objet opaque et de l'évaluer en une seule fois. Ce « mode d'exécution rapide », proposé en option dans les anciennes versions de TensorFlow, est désormais standard.

La suite de visualisation TensorBoard permet d'inspecter et de profiler le fonctionnement des graphiques à l’aide d’un tableau de bord interactif basé sur le web. Un service gratuit, Tensorboard.dev (hébergé par Google), permet d'héberger et de partager des expériences d'apprentissage automatique. Il permet de stocker jusqu'à 100 millions de scalaires, 1 Go de données tensorielles et 1 Go de données d'objets binaires. (Attention, les données hébergées dans Tensorboard.dev sont publiques, il ne convient donc pas de l’utiliser pour des projets sensibles). D’autres facilités sont apportées par Google qui développé le projet à un rythme soutenu et créé un certain nombre de solutions qui facilitent le déploiement et l'utilisation du framework. La puce TPU mentionnée plus haut, qui permet d'accélérer les performances dans le cloud du fournisseur, n'en est qu'un exemple.

Formation de modèles déterministes avec TensorFlow

Quelques éléments dans la mise en oeuvre de TensorFlow font qu’il est difficile d’obtenir des résultats d’entraînement de modèle totalement déterministe dans certains cas. Parfois, un modèle formé sur un système varie légèrement par rapport à un modèle formé sur un autre système, même s'ils reçoivent exactement les mêmes données. Les raisons de cette variance sont glissantes : l'une d'entre elles est la façon dont les nombres aléatoires sont introduits et l'endroit où ils le sont ; une autre est liée à certains comportements non déterministes lors de l'utilisation des GPU. La version 2.0 de TensorFlow comporte une option permettant d'activer le déterminisme sur l'ensemble d'un workflow en quelques lignes de code. Cette fonctionnalité a toutefois un coût en termes de performances et ne doit être utilisée que pour le débogage d'un workflow.

TensorFlow vs PyTorch, CNTK, et MXNet

TensorFlow est en concurrence avec un grand nombre d'autres frameworks d'apprentissage automatique, en particulier PyTorch, CNTK et MXNet qui répondent à des besoins identiques. PyTorch est bâti avec Python et présente beaucoup d’autres similitudes avec TensorFlow : des composants accélérés par le matériel sous le capot, un modèle de développement hautement interactif qui permet de travailler en fonction des besoins, et de nombreux composants utiles déjà inclus. PyTorch est généralement un meilleur choix pour le développement rapide de projets qui doivent être opérationnels en peu de temps, mais TensorFlow l'emporte pour les projets plus importants et les flux de travail plus complexes.

CNTK, le Microsoft Cognitive Toolkit, possède en commun avec TensorFlow une structure de graphe pour décrire le flux de données, mais il se concentre principalement sur la création de réseaux neuronaux d'apprentissage profond. Dans ce domaine, il traite de nombreux travaux de réseaux neuronaux plus rapidement et dispose d'un ensemble plus large d'API (Python, C++, C#, Java). Mais il n'est pour l’instant pas aussi facile à apprendre ou à déployer que TensorFlow. Il est par ailleurs uniquement sous licence GNU GPL 3.0, alors que TensorFlow est aussi disponible sous licence Apache, plus ouverte. Et le rythme de développement de CNTK n'est pas aussi soutenu puisque sa dernière version majeure date de 2019.

Apache MXNet, adopté par Amazon comme le premier framework d’apprentissage profond sur AWS, peut évoluer de manière presque linéaire sur plusieurs GPU et plusieurs machines. Il prend également en charge un large éventail d'API de langage - Python, C++, Scala, R, JavaScript, Julia, Perl, Go - bien que ses API natives ne soient pas aussi agréables à utiliser que celles de TensorFlow. Il dispose toutefois d'une communauté d'utilisateurs et de développeurs beaucoup plus restreinte.