El stack Blackwell (sm_120) sano
montar un entorno de IA en la 5090 que simplemente funcione, y —más importante— saber diagnosticar en segundos los tres fallos que te van a costar horas si no los reconoces. La arquitectura Blackwell (sm_120) es lo bastante nueva como para que las versiones antiguas de las librerías fallen de forma confusa.
2.1La regla de oro de Blackwell: el driver lo es todo
Antes que nada: el driver de la 5090 cambia el rendimiento por 2×. En los benchmarks de CloudRift, con el driver 570.86.15 la 5090 rendía como una 4090; al subir a 575.57.08 el throughput de vLLM se disparó. Primera comprobación siempre:
1nvidia-smi # mira "Driver Version" arriba a la derechaNecesitas driver ≥ 575 (idealmente la rama 590+ a fecha de 2026) y CUDA 12.8+. Si tu número de banda en el lab de L1 fue bajo, este suele ser el motivo.
2.2Decisión de plataforma
- Linux nativo (Ubuntu 24.04 LTS) → lo ideal.
- WSL2 (Ubuntu 24.04 sobre Windows 11) → perfectamente válido; la mayoría de frameworks lo soportan.
- Windows nativo (pip) → no. El ecosistema de ML (Triton, flash-attention, bitsandbytes, vLLM) asume Linux; en Windows nativo pelearás con builds rotos. Si estás en Windows, usa WSL2.
2.3La vía recomendada: Docker
Docker te aísla del infierno de versiones de CUDA del sistema. Necesitas el NVIDIA Container Toolkit instalado en el host.
1# (host) instalar NVIDIA Container Toolkit, una vez
2curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
3# ... (sigue la guía oficial de NVIDIA para tu distro) ...
4sudo systemctl restart docker
5
6# Smoke test: ¿ve Docker la GPU?
7docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smiImagen base de PyTorch para Blackwell (la que evita el 90% de los problemas):
1docker run --gpus all -it --rm \
2 pytorch/pytorch:2.11.0-cuda12.8-cudnn9-devel \
3 python -c "import torch; print(torch.__version__, torch.cuda.get_device_capability())"
4# Esperado: 2.11.0 (12, 0)(12, 0) es sm_120 → PyTorch reconoce tu Blackwell. Si imprime (12, 0) pero luego un kernel falla, es que esa librería concreta (no torch) no trae binarios sm_120 (ver 2.6).
2.4Entorno de trabajo con uv (fuera de Docker, para iterar rápido)
Para desarrollo interactivo, un venv por proyecto con uv (el gestor moderno, mucho más rápido que pip/conda):
1# instalar uv una vez
2curl -LsSf https://astral.sh/uv/install.sh | sh
3
4# por proyecto:
5uv venv --python 3.12
6source .venv/bin/activate
7
8# PyTorch con wheels CUDA 12.8 (¡el índice correcto es clave!)
9uv pip install torch --index-url https://download.pytorch.org/whl/cu128
10
11# verifica sm_120
12python -c "import torch; print(torch.cuda.get_device_capability())" # (12, 0)Línea no trivial: --index-url .../cu128. Si instalas torch del PyPI por defecto, puedes acabar con una build sin kernels sm_120 → el clásico error "no kernel image" (2.6). El índice cu128 garantiza binarios para CUDA 12.8/Blackwell.
2.5Las librerías del curso y sus trampas en Blackwell
| Librería | Instalación / nota Blackwell |
|---|---|
| vLLM ≥0.11 | uv pip install vllm o imagen vllm/vllm-openai:latest. Soporta NVFP4 vía CUTLASS. |
| SGLang | imagen lmsysorg/sglang:blackwell; arranca con --disable-cuda-graph (incompatibilidad SM_120 conocida en 2026). |
| Unsloth | imagen unsloth/unsloth o uv pip install unsloth. Trae kernels sm_120 (Unsloth Studio). |
| bitsandbytes | wheels CUDA 12.8 OK vía pip. |
| flash-attention | FA2 funciona en Blackwell; FA3 es Hopper-only; en la 5090 usa FA2 o el SDPA de PyTorch. |
| xformers | si falla, recompila: TORCH_CUDA_ARCH_LIST="12.0" uv pip install -v --no-build-isolation git+https://github.com/facebookresearch/xformers.git |
| Triton | ≥3.3 soporta sm_120; viene con torch reciente. |
| llama.cpp | compila con -DGGML_CUDA=ON; detecta sm_120 automáticamente en versiones recientes. |
2.6Diagnóstico: los tres fallos que tienes que reconocer al vuelo
Fallo 1 — CUDA error: no kernel image is available for execution on the device
- Significa: la librería que acabas de llamar no trae binarios compilados para sm_120.
- Causa típica: torch o alguna dependencia instalada desde un índice sin cu128, o una versión vieja.
- Fix: reinstala desde el índice cu128 / usa la imagen Docker 2.11-cuda12.8; si es una lib que compilas (xformers), añade
TORCH_CUDA_ARCH_LIST="12.0".
Fallo 2 — CUBLAS_STATUS_EXECUTION_FAILED en el primer matmul de training
- Significa: la versión de cuBLAS embebida no tiene kernels sm_120.
- Fix: sube a torch ≥2.11; si usas Unsloth, además
rm -rf /tmp/unsloth_compiled_cache(limpia kernels cacheados de una versión previa rota).
Fallo 3 — Throughput mediocre, todo "funciona" pero va lento
- Causa nº1: driver <575 (la 5090 rinde como 4090).
nvidia-smi→ sube el driver. - Causa nº2: power/thermal throttling.
nvidia-smi -q -d POWER,TEMPERATUREmientras corres; si ves clocks bajos y temps altas, mejora la refrigeración o ajusta el power limit connvidia-smi -pl.
Bonus — Gemma 4 MoE QLoRA peta en 32 GB: los tensores 3D de expertos fusionados aún no los soporta bitsandbytes (junio 2026). Workaround: usa Qwen 3.5 35B-A3B MoE (sí funciona en QLoRA) o Gemma 4 31B denso.
2.7Laboratorio L2.1 — Tu Dockerfile base reproducible
Crea el entorno que reutilizarás todo el curso:
1# Dockerfile.blackwell — base reproducible para el curso
2FROM pytorch/pytorch:2.11.0-cuda12.8-cudnn9-devel
3
4ENV DEBIAN_FRONTEND=noninteractive
5RUN apt-get update && apt-get install -y \
6 git curl build-essential cmake \
7 pciutils libcurl4-openssl-dev && \
8 rm -rf /var/lib/apt/lists/*
9
10# uv para instalar paquetes rápido dentro del contenedor
11RUN curl -LsSf https://astral.sh/uv/install.sh | sh
12ENV PATH="/root/.local/bin:${PATH}"
13
14# Stack del curso (ajusta versiones cuando avances de nivel)
15RUN uv pip install --system \
16 vllm \
17 "unsloth[cu128]" \
18 transformers trl peft datasets accelerate \
19 wandb nvitop
20
21WORKDIR /workspace
22CMD ["bash"]1docker build -f Dockerfile.blackwell -t blackwell-course .
2docker run --gpus all -it --rm -v $(pwd):/workspace blackwell-course
3# dentro: python -c "import torch, vllm, unsloth; print('ok', torch.cuda.get_device_capability())"Líneas no triviales:
pciutils/build-essential/cmake: necesarios para compilar llama.cpp y kernels on-the-fly.uv pip install --system: dentro de un contenedor no necesitas venv; instalas al Python del sistema.- Monta
-v $(pwd):/workspace: tu código vive en el host (persiste); el contenedor es desechable.
2.8Ejercicios
E1. Verifica tu driver y, si es <575, anótalo como bloqueo y actualízalo. ¿Cuánto subió tu ancho de banda del lab L1.1 tras actualizar?
E2. Provoca a propósito el "Fallo 1": instala torch desde el índice por defecto en un venv limpio y corre un matmul en GPU. Observa el error. Luego arréglalo con el índice cu128. (Aprender a reconocer el error vale más que evitarlo.)
E3. Construye el Dockerfile.blackwell, arráncalo y confirma que torch, vllm y unsloth importan y ven (12,0). Este contenedor es tu entorno para los Niveles 0–2.
2.9Trampas comunes
- Instalar torch del PyPI por defecto en lugar del índice cu128.
- Olvidar el
--disable-cuda-graphen SGLang Blackwell. - Asumir que "funciona" = "va rápido": comprueba driver y throttling.