Cet article a été écrit par un contributeur externe.
Go est un langage de programmation open source qui a été conçu par Google pour optimiser la construction et l’utilisation de services au niveau du système, simplifier le travail avec de grandes bases de code et utiliser des machines multicœurs en réseau. Lancé en 2009, Go est un langage compilé à typage statique fortement inspiré par C, qui se distingue par sa simplicité d’utilisation et par la sécurité et la simultanéité qu’il apporte.
Go a notamment été utilisé pour créer des applications à grande échelle telles que Docker et Kubernetes. Il est largement utilisé dans de grandes entreprises comme Netflix, PayPal et Uber en raison de sa faible latence, de ses performances multiplateformes et de son évolutivité. Malgré ses nombreux avantages, Go est peu utilisé dans le domaine du machine learning (ML).
Dans cet article, je présente différentes raisons pour lesquelles Go est actuellement peu utilisé pour le ML et les moyens par lesquels il pourrait progressivement gagner du terrain dans ce domaine à l’avenir.
Principaux défis liés à l’utilisation de Go pour le machine learning
Go est un langage de programmation puissant et efficace, suffisamment rapide et performant pour les calculs intensifs et gourmands en CPU que les solutions d’intelligence artificielle requièrent. Il est plus rapide que Python et la simplicité d’utilisation, l’efficacité et la simultanéité qu’il offre font défaut à d’autres langages utilisés pour le ML dans certains cas.
Malgré le potentiel de Go pour la création d’applications de ML robustes et évolutives, et ses performances supérieures à celles de plusieurs langages concurrents, il reste une option sous-estimée. La faible adoption de Go dans le domaine du ML peut être attribuée à plusieurs défis de taille qu’il n’a pas résolus, au contraire d’autres langages de programmation plus anciens. Ces défis sont principalement le manque de bibliothèques de haut niveau, l’absence de liaisons natives pour CUDA et des capacités de visualisation de données et de statistiques moins développées.
Manque de bibliothèques de haut niveau
Go étant un langage relativement récent, il compte moins d’outils et de bibliothèques que d’autres langages existant depuis des décennies, qui disposent d’écosystèmes et de bibliothèques bien établis et de qualité pour les tâches de ML.
Les développeurs qui souhaitent utiliser Go pour le ML doivent donc passer plus de temps à créer des solutions personnalisées ou à intégrer des bibliothèques et des frameworks existants qui n’ont pas été conçus spécifiquement pour Go.
Des améliorations significatives ont été apportées aux bibliothèques Go au fil des ans, notamment avec GoLearn, qui offre des capacités d’ajustement et de prédiction similaires à scikit-learn, ainsi que des fonctions utilitaires de fractionnement des tests et de validation croisée, GoMind qui fournit des capacités de réseau neuronal, et Gorgonia, une bibliothèque de calcul de graphes similaire à TensorFlow avec des capacités de mise à l’échelle.
Dans l’ensemble, même ces bibliothèques n’ont pas l’ampleur des bibliothèques Python, qui ont bénéficié de décennies de développement, et Go a encore des lacunes significatives pour certaines tâches comme le traitement du langage naturel (NLP), notamment par rapport à spaCy et NLTK.
Absence de liaisons natives pour CUDA
Compute Unified Device Architecture (CUDA) est une plateforme de calcul parallèle et un modèle de programmation développé par NVIDIA pour programmer les unités de traitement graphique (GPU). CUDA permet aux développeurs d’utiliser les capacités de calcul haute performance des GPU NVIDIA pour accélérer de nombreux types d’applications, parmi lesquelles le ML, le calcul scientifique et le traitement d’images et de vidéos, pour n’en citer que quelques-unes.
Le principal avantage de CUDA est qu’il vous permet d’utiliser le parallélisme massif des GPU pour accélérer les calculs qui peuvent être parallélisés. Malheureusement, Go n’a pas de liaisons natives avec CUDA, contrairement à Python.
Pour utiliser CUDA dans du code Go, il faut importer et utiliser des fonctions C qui créent des liaisons pour CUDA. Le code C est intégré dans Go avec la commande cgo, qui permet la création de paquets Go appellant du code C. Cependant, le recours au code C et à cgo nécessite une bonne maîtrise du langage C pour un codage et un débogage efficaces. Cela peut engendrer une surcharge de travail et un besoin en ressources importants et exposer à des failles spécifiques au langage C tels que des vulnérabilités de sécurité et des problèmes de sécurité de la mémoire.
Il existe également des paquets de code tiers, telles que cuda, qui contiennent des fonctions utilitaires pour obtenir des liaisons pour CUDA.
Contraintes relatives à l’expérimentation
Intrinsèquement, Go n’est pas le meilleur langage pour l’expérimentation. Comme il s’agit d’un langage compilé, le code Go est transformé en code machine qui peut être exécuté directement par le processeur plutôt que d’être interprété par un environnement d’exécution au moment de l’exécution. Cette fonctionnalité contribue à la vitesse et à l’efficacité de Go, mais il n’est pas possible d’écrire et d’exécuter du code Go sans le compiler au préalable. Il est donc plus difficile de tester différentes idées et approches d’un problème en Go qu’avec des langages interprétés comme Python et R (cependant, Go peut être utilisé comme langage de script).
Go n’est pas aussi dissocié du matériel sous-jacent que certains autres langages. Cela peut être un plus pour les tâches qui requierent une optimisation de bas niveau ou un contrôle étroit des ressources matérielles, mais cela peut également rendre le code Go plus verbeux et nécessiter plus d’installation et de configuration initiales par rapport à des langages comme Python, qui sont plus flexibles et faciles à utiliser dans certains cas. Compte tenu de l’ampleur des bibliothèques et des frameworks comme scikit-learn et TensorFlow, et de la disponibilité de solutions plus simples pour des tâches comme l’extraction de fonctionnalités, le clustering et la réduction de la dimensionnalité dans un seul paquet, Go n’est pas le choix idéal pour l’expérimentation en ML.
Les langages compilés comme Go sont généralement un meilleur choix pour les tâches hautes performances, telles que la programmation côté serveur et l’optimisation des applications en temps réel.
Capacités insuffisantes en mathématiques et statistiques
Comme dit précédemment, Go n’a pas l’ampleur de poids lourds tels que Python. Il a moins de bibliothèques spécialisées et de paquets axés sur les statistiques, le calcul et la manipulation de matrices, qui constituent une grande partie du développement de l’IA et du ML.
Cela n’est pas forcément un inconvénient majeur pour tout le monde, certains développeurs appréciant d’avoir la possibilité d’écrire activement le code de leur algorithme de ML ou de leur logique mathématique. Mais ici encore, si on le compare à Python, Go ne propose pas la même simplicité d’utilisation pour les manipulations de données, analyses et algorithmes prédictifs.
Python, R et Julia sont aussi bien implantés dans la communauté du ML parce qu’ils étaient là avant Go et continuent d’évoluer pour mieux répondre aux besoins du ML et de l’IA, ce qui rend encore plus difficile pour Go de se positionner comme une alternative viable.
Bibliothèques de haut niveau en Go
Go dispose de quelques bibliothèques de haut niveau comme Gonum, Gorgonia et GoLearn, qui fournissent notamment des outils pour construire et entraîner des réseaux neuronaux et effectuer des calculs numériques,
mais elles ne sont pas aussi riches en fonctionnalités que les bibliothèques Python. Les bibliothèques et frameworks Python commeTensorFlow, scikit-learn et spaCy, sont populaires dans le domaine du ML et ont été créés et développés de manière itérative pour répondre aux besoins des développeurs spécialisés en ML. Ils offrent des fonctionnalités pour le traitement du langage naturel, l’intégration d’images, les réseaux neuronaux et d’autres sujets d’intérêt pour le ML.
Vous pourriez obtenir ces mêmes capacités en Go et elles seraient potentiellement plus puissantes et efficaces grâce aux avantages caractéristiques de Go par rapport à d’autres langages que sont la mise en réseau, la simultanéité et le traitement des données.
Mais pour le moment, la création de ces capacités ne serait utile qu’à la communauté des développeurs Go, car il n’est pas aussi largement utilisé par la communauté du ML que Python ou R. Il souffre également d’un manque de contributeurs par rapport aux langages plus anciens et d’un écosystème de bibliothèques et d’outils plus petit, ce qui rend la recherche de solutions préexistantes à certains problèmes plus difficile.
La situation est-elle en train de changer ?
Go gagne en popularité et sa communauté d’utilisateurs est en croissance. Selon StackShare, le nombre d’entreprises utilisant Go actuellement s’élève à 2 751, parmi lesquelles Uber, Twitch, Shopify et Slack. De plus, selon l’enquête 2021 Stack Overflow Developer Survey, Go est utilisé par environ 9,55 % des développeurs, ce qui en fait le 14e langage de programmation le plus populaire.
C’est une bonne nouvelle pour la communauté Go, mais cela ne se ressent pas vraiment dans le domaine du ML. Go est principalement connu pour ses capacités en matière de création de serveurs évolutifs et de grands systèmes logiciels, d’écriture de programmes concurrents et de construction de microservices rapides et légers. Même le site officiel de Go ne mentionne pas le ML parmi ses principaux cas d’utilisation.
Cela témoigne de la tendance actuelle de Go à s’éloigner du domaine du ML et de son manque d’ancrage au sein de la communauté du ML.
Futurs cas d’utilisation
Jusqu’à présent, il n’y a pas d’exemples d’utilisation de Go pour le ML marquants. Cependant, si on se focalise sur ses points forts, on peut voir les choses autrement et envisager d’utiliser Go non pas pour développer des modèles de ML mais pour construire des serveurs de modèles de ML qui permettent à d’autres applications ou systèmes d’accéder aux modèles et de les utiliser.
Cela peut être utile pour déployer des modèles de ML en production ou pour créer des API de ML accessibles à d’autres développeurs ou utilisateurs. Go peut être utilisé pour créer des applications de ML telles que des moteurs de recommandations alimentés par ML ou des outils de traitement du langage naturel. Il peut également servir à construire l’infrastructure backend ou les interfaces utilisateur pour ces types d’applications.
Un bon moyen pour la communauté Go d’ouvrir la base de code à plus d’expérimentation dans le domaine du ML pourrait être de créer plus de boîtes à outils et de frameworks permettant d’améliorer la vitesse et l’efficacité du ML côté serveur.
Conclusion
Malgré ses qualités, Go a encore des défis à relever afin d’être plus largement utilisé pour le machine learning, mais les différents axes d’améliorations et cas d’utilisation que j’ai exposés dans cet articles permettent de penser qu’il pourra faire une percée dans ce domaine dans les années à venir.