Go para el aprendizaje automático: evaluando posibilidades y limitaciones
El mundo del aprendizaje automático (ML) está fuertemente asociado con Python. Sin embargo, en los últimos años se escuchan cada vez más voces de desarrolladores que preguntan: «¿Se puede usar Go (Golang) para ML?». Este lenguaje, creado en las profundidades de Google, es famoso por su rendimiento, simplicidad y excelente soporte para concurrencia. En este artículo, analizaremos qué tan justificado está el uso de Go en tareas de aprendizaje automático, cuáles son sus puntos fuertes y dónde se queda corto frente a las soluciones establecidas.
¿Por qué Go puede ser interesante para ML?
Go no fue diseñado originalmente como un lenguaje para Data Science. Sus principales ventajas son la velocidad de ejecución, la gestión eficiente de la memoria y el soporte integrado para paralelismo (gorutinas y canales). Para sistemas en producción que requieren baja latencia y alto rendimiento, estas cualidades son invaluables. A diferencia de Python, que a menudo sirve como «pegamento» para llamar a bibliotecas en C++, Go permite escribir servicios rápidos y autosuficientes.
La ventaja clave de Go en ML es la facilidad de despliegue. Un único binario compilado no requiere instalación de intérprete, entornos virtuales ni decenas de dependencias. Esto convierte a Go en una opción ideal para crear microservicios que realizan inferencia (predicciones) de modelos entrenados.
Principales bibliotecas de Go para aprendizaje automático
El ecosistema de Go para ML es significativamente inferior al de Python, pero existe y se está desarrollando activamente. Aquí están las bibliotecas clave que vale la pena conocer:
- Gorgonia — el principal framework para deep learning en Go. Proporciona primitivas de bajo nivel para construir y entrenar redes neuronales, recordando en espíritu a TensorFlow o Theano. Gorgonia puede realizar diferenciación automática y soporta trabajo en GPU.
- GoLearn — un análogo de scikit-learn. Contiene implementaciones de algoritmos populares: regresión lineal, K-vecinos más cercanos, árboles de decisión, clustering K-means y métodos de preprocesamiento de datos. La biblioteca tiene una API clara, pero su funcionalidad es aún más modesta que la de sus análogos en Python.
- goml — otra biblioteca centrada en la simplicidad de uso. Soporta regresión lineal y logística, redes neuronales, máquinas de vectores de soporte (SVM) y clasificadores bayesianos.
- TensorFlow Go API — el binding oficial de Google. Permite cargar y ejecutar modelos TensorFlow preentrenados (formato SavedModel). Es una excelente opción para inferencia en producción: entrenas el modelo en Python y lo ejecutas en Go.
- ONNX Runtime Go — biblioteca para trabajar con modelos en formato ONNX (Open Neural Network Exchange). Permite usar modelos entrenados en PyTorch, TensorFlow u otros frameworks en aplicaciones Go.
Veamos un ejemplo simple de uso de Gorgonia para crear una regresión lineal:
package main
import ( "fmt" "gorgonia.org/gorgonia" "gorgonia.org/tensor")
func main() { g := gorgonia.NewGraph()
// Datos de entrada (x) y etiquetas (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"))
// Parámetros del modelo: peso (w) y sesgo (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()))
// Modelo: y_pred = x * w + b pred := gorgonia.Must(gorgonia.Add(gorgonia.Must(gorgonia.Mul(x, w)), b))
// Función de pérdida: MSE loss := gorgonia.Must(gorgonia.Mean(gorgonia.Must(gorgonia.Square(gorgonia.Must(gorgonia.Sub(pred, y))))))
fmt.Println("Grafo construido")