Go pour l'apprentissage automatique : peser les possibilités et les limites
Le monde de l'apprentissage automatique (ML) est fortement associé à Python. Cependant, ces dernières années, on entend de plus en plus souvent des développeurs poser la question : « Peut-on utiliser Go (Golang) pour le ML ? ». Ce langage, créé au sein de Google, est réputé pour ses performances, sa simplicité et son excellent support de la concurrence. Dans cet article, nous allons analyser dans quelle mesure l'utilisation de Go dans les tâches de machine learning est justifiée, quels sont ses points forts et où il cède le pas aux solutions établies.
Pourquoi Go pourrait-il être intéressant pour le ML ?
Go n'a pas été initialement conçu comme un langage pour la Data Science. Ses principaux atouts sont la vitesse d'exécution, la gestion efficace de la mémoire et le support intégré du parallélisme (goroutines et canaux). Pour les systèmes de production où une faible latence et un haut débit sont requis, ces qualités sont inestimables. Contrairement à Python, qui sert souvent de « colle » pour appeler des bibliothèques en C++, Go permet d'écrire des services rapides et autonomes.
L'avantage clé de Go en ML est la facilité de déploiement. Un seul binaire compilé ne nécessite pas l'installation d'un interpréteur, d'environnements virtuels et de dizaines de dépendances. Cela fait de Go un choix idéal pour créer des microservices qui effectuent l'inférence (prédictions) de modèles entraînés.
Les principales bibliothèques Go pour l'apprentissage automatique
L'écosystème Go pour le ML est nettement inférieur à celui de Python, mais il existe et se développe activement. Voici les bibliothèques clés à connaître :
- Gorgonia — le principal framework pour le deep learning en Go. Il fournit des primitives de bas niveau pour construire et entraîner des réseaux de neurones, rappelant par son esprit TensorFlow ou Theano. Gorgonia est capable d'effectuer la différenciation automatique et supporte le travail sur GPU.
- GoLearn — un analogue de scikit-learn. Il contient des implémentations d'algorithmes populaires : régression linéaire, K-plus proches voisins, arbres de décision, clustering K-means et méthodes de prétraitement des données. La bibliothèque a une API claire, mais ses fonctionnalités sont encore plus modestes que celles des analogues Python.
- goml — une autre bibliothèque axée sur la simplicité d'utilisation. Elle supporte la régression linéaire et logistique, les réseaux de neurones, les machines à vecteurs de support (SVM) et les classifieurs bayésiens.
- TensorFlow Go API — la liaison officielle de Google. Elle permet de charger et d'exécuter des modèles TensorFlow pré-entraînés (format SavedModel). C'est une excellente option pour l'inférence en production : vous entraînez le modèle en Python et l'exécutez en Go.
- ONNX Runtime Go — une bibliothèque pour travailler avec des modèles au format ONNX (Open Neural Network Exchange). Elle permet d'utiliser des modèles entraînés avec PyTorch, TensorFlow ou d'autres frameworks dans des applications Go.
Regardons un exemple simple d'utilisation de Gorgonia pour créer une régression linéaire :
package main
import ( "fmt" "gorgonia.org/gorgonia" "gorgonia.org/tensor")
func main() { g := gorgonia.NewGraph()
// Données d'entrée (x) et étiquettes (y) x := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithShape(3, 1), gorgonia.WithName("x")) y := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithShape(3, 1), gorgonia.WithName("y"))
// Paramètres du modèle : poids (w) et biais (b) w := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithShape(1, 1), gorgonia.WithName("w"), gorgonia.WithInit(gorgonia.GlorotN(1.0))) b := gorgonia.NewScalar(g, tensor.Float64, gorgonia.WithName("b"), gorgonia.WithInit(gorgonia.Zeroes()))
// Modèle : y_pred = x * w + b pred := gorgonia.Must(gorgonia.Add(gorgonia.Must(gorgonia.Mul(x, w)), b))
// Fonction de perte : MSE loss := gorgonia.Must(gorgonia.Mean(gorgonia.Must(gorgonia.Square(gorgonia.Must(gorgonia.Sub(pred, y))))))
fmt.Println("Graphe construit")
```