getvram pone un techo de VRAM a cada contenedor. A se pasa y hace OOM local. B sigue sirviendo. El runtime es MIT. El grant se compra.
# Sin getvram: un contenedor se queda con la GPU services: llm: image: ollama/ollama # ❌ Se come los 8 GiB. El vecino muere por OOM deploy: resources: reservations: devices: - driver: nvidia capabilities: [gpu]
# Con getvram: cada servicio tiene su techo services: llm-inference: image: ollama/ollama runtime: vram labels: vram.limit: "6144m" # ✅ 6 GiB grant vram.priority: "high" embedder: image: my-embedder runtime: vram labels: vram.limit: "1024m" # ✅ 1 GiB, auto-burst if idle training: image: pytorch/pytorch runtime: vram labels: vram.limit: "2048m" # ✅ 2 GiB, BestEffort QoS vram.priority: "low"
A se queda con 8 GiB. B cae con CUDA out of memory. Matás A. Reiniciás B. Otra vez.
nvidia-container-toolkit, versiones de CUDA, WSL2, MPS. Horas de config antes de una línea de modelo.
La GPU al 5% mientras el LLM espera. El resto de contenedores bloqueados.
Un contenedor mal portado ensucia el estado compartido. MPS no aísla memoria: un crash puede tumbar el contexto entero.
getvram no se mete de proxy entre el contenedor y la GPU. Habla con la CUDA Driver API a nivel de MMU de la GPU, la misma capa que usa el vGPU de NVIDIA.
Al arranque, cuMemAddressReserve reserva un espacio virtual del tamaño de la VRAM. Todavía no hay páginas físicas.
Al registrar (hook OCI), cuMemCreate crea un bloque físico del tamaño de la cuota. El handle se puede pasar entre procesos.
cuMemMap + cuMemSetAccess pega cada handle a un rango virtual distinto. Los punteros de A no se cruzan con los de B. Lo impone la MMU.
Si un contenedor está idle, se pueden remapear páginas a otro en microsegundos. Sin copiar datos. Un cuMemUnmap + cuMemMap.
| Qué | NVIDIA MPS | NVIDIA MIG | Time-Slicing | getvram |
|---|---|---|---|---|
| Aislamiento de memoria | ❌ Nada | ✅ Físico | ❌ Nada | ✅ VA-level (MMU) |
| Resize dinámico | ❌ Estático | ❌ Hay que reconfigurar | ⚠️ Solo burst | ✅ Hot-resize in μs |
| Cualquier CUDA | ✅ | ⚠️ Solo A100/H100 | ✅ | ✅ Pascal+ |
| Docker Desktop | ❌ | ❌ | ❌ | ✅ Docker en Linux · vram run en Mac |
| OOM por contenedor | ❌ Cascada | ✅ | ❌ | ✅ Aislado |
| Config | Hay que armar MPS | Hardware + perfil | Flag del driver | Labels de Docker |
| Apple Silicon (M-series) | ❌ | ❌ | ❌ | ✅ Metal MTLHeap (v2) |
Licencia de software, una máquina. No es SaaS. No es un producto de clúster. Kubernetes no se vende porque no está hecho.
vram, gratisvram.limit=4g)vram init escribe un compose de OllamaEl número es un label. Nadie lo hace cumplir. Un vecino greedy se puede quedar con la placa.
GitHubvram runLicencia de esa máquina. No nos quedamos con tu GPU ni con tus modelos.
hello@getvram.comCon --gpus all comparten el device, no la memoria. El primer cudaMalloc se suele quedar con la placa. El segundo muere con CUDA OOM. getvram pone un techo de VRAM a cada contenedor. Pasarse es OOM local. El vecino sigue generando.
vram.limit?No. docker-vram es el runtime y el CLI. Los contenedores arrancan. Las labels se anotan. Ese repo no trae daemon. El grant pago es lo que lo hace cumplir en tu máquina.
Docker Desktop es una VM Linux. Metal del host no ve esos contenedores. En Apple Silicon: vram run --limit=1g -- ollama serve. Memoria unificada: el producto es la cuota, no un OOM en cascada al vecino.
No. Lo instalás en hardware que ya tenés. No alquilamos GPUs y no hosteamos tus modelos.
Dejá el mail si querés el grant en tu placa. El runtime MIT ya está en GitHub. No alquilamos GPUs.