PyTorch es uno de los fra­me­wo­r­ks líderes a nivel mundial en apre­n­di­za­je profundo y es utilizado tanto por equipos de in­ve­s­ti­ga­ción como por startups y grandes empresas te­c­no­ló­gi­cas. Permite de­sa­rro­llar, entrenar y escalar redes neu­ro­na­les de forma sencilla y flexible.

PyTorch: ¿qué es?

PyTorch es un framework de código abierto para apre­n­di­za­je au­to­má­ti­co, basado en Python. Esto lo hace es­pe­cia­l­me­n­te accesible para pri­n­ci­pia­n­tes y, al mismo tiempo, lo su­fi­cie­n­te­me­n­te potente para modelos complejos de apre­n­di­za­je profundo. PyTorch permite crear y optimizar redes neu­ro­na­les de forma flexible y ofrece una sintaxis intuitiva muy cercana al código Python habitual.

El framework está es­pe­cia­l­me­n­te extendido en el ámbito de la in­ve­s­ti­ga­ción, ya que su modelo de cálculo dinámico facilita ite­ra­cio­nes rápidas y ex­pe­ri­me­n­ta­ción ágil. Al mismo tiempo, PyTorch se utiliza cada vez más en entornos in­du­s­tria­les, puesto que los modelos pueden llevarse a pro­du­c­ción o ex­po­r­tar­se sin grandes co­m­pli­ca­cio­nes. Gracias a su estrecha in­te­gra­ción con la ace­le­ra­ción por GPU, también ofrece un alto re­n­di­mie­n­to. Además, PyTorch evo­lu­cio­na de forma continua y se beneficia de una comunidad activa y de ac­tua­li­za­cio­nes pe­rió­di­cas.

He­rra­mie­n­tas de IA
Saca el máximo partido a la in­te­li­ge­n­cia ar­ti­fi­cial
  • Crea tu página web en tiempo récord
  • Impulsa tu negocio gracias al marketing de IA
  • Ahorra tiempo y obtén mejores re­su­l­ta­dos

¿Cómo funciona PyTorch?

PyTorch se basa en re­pre­se­n­tar cálculos numéricos de forma eficiente y flexible mediante ope­ra­cio­nes con tensores. Los tensores son es­tru­c­tu­ras de datos mu­l­ti­di­me­n­sio­na­les similares a los arrays de Python, pero op­ti­mi­za­das para co­mpu­tación de alto re­n­di­mie­n­to. El framework ejecuta los cálculos paso a paso y construye el flujo de cálculo su­b­ya­ce­n­te de forma dinámica durante la ejecución del programa. Así, cada operación se evalúa in­me­dia­ta­me­n­te, igual que en el código Python habitual. Esto di­fe­re­n­cia a PyTorch de los enfoques estáticos, en los que el grafo de cálculo debe definirse por completo antes de la ejecución.

Este modelo dinámico hace que PyTorch resulte es­pe­cia­l­me­n­te intuitivo:

  • Las es­tru­c­tu­ras de control, como bucles, co­n­di­cio­nes o procesos re­cu­r­si­vos, se integran di­re­c­ta­me­n­te en el cálculo durante la ejecución
  • No se requiere una sintaxis especial ni so­lu­cio­nes al­te­r­na­ti­vas para definir la lógica del modelo.
  • PyTorch puede rastrear au­to­má­ti­ca­me­n­te todas las ope­ra­cio­nes y calcular las derivadas ne­ce­sa­rias para el en­tre­na­mie­n­to de redes neu­ro­na­les.

Otro principio clave es la ab­s­tra­c­ción fluida del hardware. Los tensores pueden moverse con fle­xi­bi­li­dad entre la CPU y la GPU sin necesidad de modificar el código de los cálculos. PyTorch se encarga de ejecutar las ope­ra­cio­nes de la forma más eficiente posible en cada entorno.

Las funciones más im­po­r­ta­n­tes de PyTorch

La amplia gama de funciones hace que PyTorch resulte atractivo tanto para la in­ve­s­ti­ga­ción como para el uso em­pre­sa­rial. Entre los co­m­po­ne­n­tes más re­le­va­n­tes de esta bi­blio­te­ca de Python se en­cue­n­tran los si­guie­n­tes:

  • Grafos de cálculo dinámicos: PyTorch crea los grafos de cálculo durante la ejecución del programa. Esto resulta es­pe­cia­l­me­n­te útil para modelos cuya es­tru­c­tu­ra puede cambiar durante el en­tre­na­mie­n­to, por ejemplo en redes re­cu­rre­n­tes o modelos ge­ne­ra­ti­vos como las GAN. Además, facilita no­ta­ble­me­n­te la de­pu­ra­ción, ya que puedes trabajar di­re­c­ta­me­n­te con el depurador estándar de Python.
  • Autograd para la di­fe­re­n­cia­ción au­to­má­ti­ca: el módulo Autograd calcula los gra­die­n­tes de forma au­to­má­ti­ca a partir de las ope­ra­cio­nes rea­li­za­das sobre los tensores. De este modo, se elimina la necesidad de derivar ma­nua­l­me­n­te funciones ma­te­má­ti­cas complejas, lo que acelera de forma co­n­si­de­ra­ble el de­sa­rro­llo, es­pe­cia­l­me­n­te en el apre­n­di­za­je profundo.
  • Co­m­pa­ti­bi­li­dad con GPU: con una sola línea de código es posible mover tensores a la GPU. PyTorch es co­m­pa­ti­ble con NVIDIA CUDA y cuDNN, lo que permite acelerar de forma si­g­ni­fi­ca­ti­va las ope­ra­cio­nes con un alto coste co­mpu­tacio­nal. Esto lo hace es­pe­cia­l­me­n­te adecuado para modelos de imagen, texto o voz de gran tamaño.
  • Módulo torch.nn: este módulo pro­po­r­cio­na co­m­po­ne­n­tes listos para usar, como capas y funciones de ac­ti­va­ción. Gracias a ello, incluso los modelos complejos pueden co­n­s­trui­r­se de forma rápida y es­tru­c­tu­ra­da, sin perder el control detallado sobre el proceso de en­tre­na­mie­n­to.
  • torch.compile para una ejecución op­ti­mi­za­da: desde la versión 2.0, PyTorch incluye torch.compile(), una función que permite optimizar modelos de forma au­to­má­ti­ca. Así, muchos modelos pueden en­tre­nar­se y eje­cu­tar­se de manera no­ta­ble­me­n­te más rápida, sin necesidad de modificar el código existente.
  • Comunidad y eco­si­s­te­ma sólidos: bi­blio­te­cas como TorchVision, TorchText, PyTorch Lightning y Lightning AI amplían PyTorch con funciones es­pe­cia­li­za­das. Además, la comunidad aporta abu­n­da­n­tes buenas prácticas, tu­to­ria­les y modelos pree­n­tre­na­dos, lo que facilita es­pe­cia­l­me­n­te los primeros pasos.

¿Qué ventajas y de­s­ve­n­ta­jas tiene PyTorch?

PyTorch destaca por su fle­xi­bi­li­dad, su alto re­n­di­mie­n­to y una curva de entrada re­la­ti­va­me­n­te accesible. No obstante, como ocurre con cualquier framework, también presenta ciertos in­co­n­ve­nie­n­tes que conviene valorar según el tipo de proyecto.

Ventajas de PyTorch

PyTorch se ca­ra­c­te­ri­za por una sintaxis intuitiva y muy cercana a Python, lo que facilita es­pe­cia­l­me­n­te los primeros pasos. Los grafos de cálculo dinámicos permiten iterar con rapidez, probar ideas de forma ágil y depurar modelos sin fri­c­cio­nes. Asimismo, ofrece una in­te­gra­ción sólida con GPU, lo que lo hace adecuado tanto para pro­to­ti­pos como para modelos de apre­n­di­za­je profundo a gran escala. Además, PyTorch se utiliza de forma habitual en ámbitos clave como los si­guie­n­tes:

De­s­ve­n­ta­jas de PyTorch

La gran libertad que ofrece PyTorch a la hora de es­tru­c­tu­rar proyectos implica también mayores exi­ge­n­cias en la pla­ni­fi­ca­ción y co­n­fi­gu­ra­ción. Aunque durante años se consideró que algunas he­rra­mie­n­tas de pro­du­c­ción del eco­si­s­te­ma Te­n­so­r­Flow estaban más maduras, PyTorch ha reducido cla­ra­me­n­te esa di­fe­re­n­cia en versiones recientes. En de­s­plie­gues in­du­s­tria­les complejos, la im­ple­me­n­ta­ción puede resultar exigente, es­pe­cia­l­me­n­te cuando se combinan distintos entornos de hardware como CPU, GPU o di­s­po­si­ti­vos edge. Además, la curva de apre­n­di­za­je se vuelve más pro­nu­n­cia­da al trabajar con modelos muy grandes, en­tre­na­mie­n­to di­s­tri­bui­do o pipelines de pro­du­c­ción avanzados. Para quienes se inician, PyTorch también requiere una co­m­pre­n­sión básica de conceptos fu­n­da­me­n­ta­les como tensores, di­fe­re­n­cia­ción au­to­má­ti­ca y la im­ple­me­n­ta­ción manual de bucles de en­tre­na­mie­n­to, lo que puede suponer un primer obstáculo técnico.

Ventajas y de­s­ve­n­ta­jas de PyTorch de un vistazo

Ventajas De­s­ve­n­ta­jas
Sintaxis intuitiva y cercana a Python A menudo requiere más código propio
Grafos dinámicos y de­pu­ra­ción eficiente En­tre­na­mie­n­to complejo en co­n­fi­gu­ra­cio­nes a gran escala
In­te­gra­ción muy sólida con GPU El de­s­plie­gue en pro­du­c­ción puede ser exigente
Apto para in­ve­s­ti­ga­ción e industria Curva de apre­n­di­za­je pro­nu­n­cia­da en proyectos complejos
Amplio eco­si­s­te­ma de bi­blio­te­cas No ofrece una solución integral lista para usar

Ámbitos de apli­ca­ción de PyTorch

PyTorch se utiliza en una amplia variedad de es­ce­na­rios prácticos, tanto en in­ve­s­ti­ga­ción como en entornos pro­du­c­ti­vos:

  • En el pro­ce­sa­mie­n­to de imágenes, se emplea para entrenar modelos de detección de objetos, cla­si­fi­ca­ción y análisis de imágenes médicas.
  • En el pro­ce­sa­mie­n­to del lenguaje natural, sirve de base para muchos modelos Tra­n­s­fo­r­mer y chatbots modernos.
  • En la síntesis de voz, por ejemplo en sistemas de texto a voz (Text-to-Speech), el framework desempeña un papel relevante.
  • En el análisis de series te­m­po­ra­les, se utiliza para pre­di­c­cio­nes en sectores como el fi­na­n­cie­ro o el ene­r­gé­ti­co.
  • Cada vez más empresas recurren a PyTorch para sistemas de re­co­me­n­da­ción.
  • También es habitual en el apre­n­di­za­je por refuerzo, por ejemplo en robótica o de­sa­rro­llo de vi­deo­jue­gos.
  • PyTorch resulta igua­l­me­n­te adecuado tanto para el pro­to­ti­pa­do rápido como para el de­sa­rro­llo y la operación de modelos de IA en pro­du­c­ción.

Ejemplo sencillo: pequeña red neuronal en PyTorch

Antes de trabajar con modelos más complejos, un ejemplo sencillo ayuda a co­m­pre­n­der los pri­n­ci­pios básicos del en­tre­na­mie­n­to en PyTorch. La siguiente red neuronal mínima muestra cómo los datos de entrada se propagan a través del modelo, cómo se calcula la pérdida y cómo PyTorch genera au­to­má­ti­ca­me­n­te los gra­die­n­tes ne­ce­sa­rios para optimizar los pa­rá­me­tros durante el en­tre­na­mie­n­to.

import torch
import torch.nn as nn
import torch.optim as optim
# Definir una red neuronal sencilla
class SimpleNet(nn.Module):
    def __init__(self):
        super(SimpleNet, self).__init__()
        self.layer1 = nn.Linear(2, 4)  # Entrada: 2 características, salida: 4 neuronas
        self.layer2 = nn.Linear(4, 1)  # Entrada: 4 neuronas, salida: 1 valor
 
    def forward(self, x):
        x = torch.relu(self.layer1(x))  # Función de activación ReLU
        return self.layer2(x)
 
# Definir el modelo, la función de pérdida y el optimizador
model = SimpleNet()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)
 
# Definir los datos de entrada y los valores objetivo (datos de ejemplo)
inputs = torch.tensor([[0.2, 0.4], [0.5, 0.9]], dtype=torch.float32)
targets = torch.tensor([[1.0], [2.0]], dtype=torch.float32)
 
# Bucle de entrenamiento
for epoch in range(100):
    optimizer.zero_grad()           # Restablecer los gradientes
    outputs = model(inputs)         # Calcular la predicción
    loss = criterion(outputs, targets)  # Calcular la pérdida
    loss.backward()                 # Calcular los gradientes
    optimizer.step()                # Actualizar los pesos
# Mostrar el resultado
print("Entrenamiento finalizado. Loss:", loss.item())
python

En el ejemplo de código, primero se define un modelo muy pequeño que procesa dos valores de entrada y predice un único valor de salida. Consta de dos capas (Linear), cada una con pesos en­tre­na­bles, que tra­n­s­fo­r­man los datos mediante mu­l­ti­pli­ca­cio­nes de matrices. En el método forward se describe cómo fluyen los datos a través del modelo: primero pasan por la primera capa, luego por una función de ac­ti­va­ción ReLU, que establece los valores negativos en “cero”, y fi­na­l­me­n­te por la segunda capa, que genera la salida final.

A co­n­ti­nua­ción, el código define datos de ejemplo sencillos como entradas y los valores objetivo co­rre­s­po­n­die­n­tes que la red debe aprender a re­pro­du­cir. En el bucle de en­tre­na­mie­n­to, el modelo repite de forma iterativa siempre el mismo proceso:

  1. Hace una pre­di­c­ción.
  2. Se calcula la pérdida.
  3. A co­n­ti­nua­ción, PyTorch ajusta los pesos.

Para que el ajuste funcione co­rre­c­ta­me­n­te, optimizer.zero_grad() re­s­ta­ble­ce primero los gra­die­n­tes de la iteración anterior. A co­n­ti­nua­ción, con loss.backward(), PyTorch calcula au­to­má­ti­ca­me­n­te cómo co­n­tri­bu­ye cada peso a la pérdida, y optimizer.step() utiliza esa in­fo­r­ma­ción para ac­tua­li­zar los pa­rá­me­tros del modelo. Este proceso se repite muchas veces. Tras unas 100 ite­ra­cio­nes, se observa que la pequeña red ya aproxima muy bien los valores objetivo. Pre­ci­sa­me­n­te este ciclo de predecir, medir la pérdida y ajustar los pesos co­n­s­ti­tu­ye el núcleo del apre­n­di­za­je profundo y funciona del mismo modo tanto en modelos muy grandes como en este ejemplo sencillo.

Ir al menú principal