LECCIÓN 10 · AVANZADO

GPU / CUDA

El superpoder que distingue a PyTorch de NumPy. Mover los cálculos a la tarjeta gráfica los acelera decenas de veces — y se hace con una sola línea bien escrita.

Recuerda de la lección anterior: aprendiste el ciclo completo de entrenamiento con DataLoader, train/eval, guardado con state_dict. Ahora añadimos un acelerador: mover ese mismo ciclo a la GPU para que vaya decenas de veces más rápido.

1. ¿Por qué la GPU es tan rápida para redes?

Entrenar una red es, sobre todo, multiplicar matrices enormes. Una CPU tiene pocos núcleos muy potentes (buenos para tareas secuenciales). Una GPU tiene miles de núcleos pequeños que hacen muchísimas multiplicaciones en paralelo — justo lo que necesita una red.

Las operaciones con tensores (matmul, sumas elemento a elemento) son completamente independientes entre sí — cada resultado no necesita esperar el anterior. Los ingenieros llaman a esto "vergonzosamente paralelas" (solo una expresión de jerga que significa "perfectamente paralelizable"). La GPU tiene miles de núcleos que las ejecutan todas a la vez. Por eso entrenar en GPU puede ser 10–50× más rápido que en CPU.

2. ¿Tengo GPU disponible?

CUDA (Compute Unified Device Architecture) es el nombre de la tecnología de NVIDIA que permite usar la GPU para cálculos. torch.cuda es el módulo de PyTorch que la gestiona.

print(torch.cuda.is_available())
salida real (este entorno)False

Este entorno tiene PyTorch +cpu, así que no hay GPU NVIDIA (CUDA). No pasa nada: todo el curso funciona en CPU. Pero el código que verás es el que usarías con GPU — y lo bueno es que es el mismo en ambos casos.

3. El patrón "device-agnostic" (el correcto)

En vez de escribir .cuda() a lo bruto, define un device al inicio que sea GPU si existe, o CPU si no. Así tu código corre en cualquier máquina sin cambios:

device = 'cuda' if torch.cuda.is_available() else 'cpu'

t = torch.tensor([1., 2., 3.]).to(device)
print(t.device)
salida realdevice elegido: cpu tensor.device: cpu

En una máquina con GPU, esa misma línea imprimiría cuda:0 — el :0 indica que es la primera GPU (los sistemas pueden tener más de una, numeradas desde 0). Los cálculos correrían en la tarjeta y no tocarías nada más del código.

4. La regla de oro: TODO en el mismo device

Para entrenar en GPU, mueve el modelo y los datos al device:

net = net.to(device)            # el modelo a la GPU

for xb, yb in dl:
    xb = xb.to(device)          # los datos del lote, también
    yb = yb.to(device)
    ...                        # el resto del bucle es idéntico
⚠️ El error #1 con GPU: mezclar tensores en device distinto. Si el modelo está en cuda y los datos en cpu, PyTorch lanza "Expected all tensors to be on the same device". Regla: modelo y datos, siempre en el mismo sitio.

5. Lo que aprendiste

Lo que aprendiste hoy: CUDA es la tecnología de NVIDIA para GPU. La GPU acelera el entrenamiento porque ejecuta miles de operaciones matriciales en paralelo. El patrón device-agnostic: device = 'cuda' if torch.cuda.is_available() else 'cpu'. Luego: net.to(device) y xb.to(device) en cada lote. Regla de oro: modelo y datos siempre en el mismo device.

En la próxima lección: el overfitting con las herramientas de PyTorch — dropout, weight decay y BatchNorm.