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.

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 "vergonzosamente paralelas": miles de cuentas independientes a la vez. La GPU las devora. Por eso entrenar en GPU puede ser 10–50× más rápido que en CPU.

2. ¿Tengo GPU disponible?

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 y los cálculos correrían en la tarjeta. No tocas nada más.

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. Resumen

La GPU acelera el entrenamiento porque paraleliza las operaciones matriciales. Usa el patrón device = 'cuda' if torch.cuda.is_available() else 'cpu' y manda modelo y datos con .to(device). Mismo código en CPU y GPU. En la próxima lección atacamos un problema que ya conoces de teoría — el overfitting — con las herramientas de PyTorch: dropout, weight decay y BatchNorm.