sodcalculator

10 Tech How-To

CUDA Out of Memory on Laptop GPU: Fix Guide

Guide 10-29745 · Updated · Step by step

Running out of CUDA memory on a laptop GPU is a common frustration when training models or running inference. This guide walks you through practical steps to diagnose and fix the error, from freeing up memory to optimizing your code. You’ll need basic familiarity with the command line and your deep learning framework (PyTorch, TensorFlow, etc.).

What You’ll Need

  • A laptop with an NVIDIA GPU and CUDA installed (check with nvidia-smi).
  • Access to a terminal or command prompt.
  • Your Python environment with the deep learning framework installed.

Step-by-Step

  1. Check current GPU memory usage. Run nvidia-smi in your terminal. Look at the “Memory-Usage” column for your GPU. If it’s already near the limit, other processes are using it.
  2. Identify and kill other GPU processes. In nvidia-smi, note the PID of any process using memory. On Windows, use taskkill /PID [PID] /F; on Linux, kill -9 [PID]. Be careful not to kill system processes.
  3. Reduce batch size. In your training script, lower the batch size (e.g., from 32 to 16 or 8). This directly reduces memory usage per iteration.
  4. Use gradient accumulation. If you need a larger effective batch size, accumulate gradients over several steps. In PyTorch, you can loop over mini-batches, call loss.backward() each time, and only step the optimizer after N steps.
  5. Enable mixed precision. Use automatic mixed precision (AMP) to reduce memory by using float16 instead of float32. In PyTorch, use torch.cuda.amp.autocast() and GradScaler. In TensorFlow, use tf.keras.mixed_precision.set_global_policy('mixed_float16').
  6. Free memory in code. Delete unused tensors and call torch.cuda.empty_cache() (PyTorch) or tf.keras.backend.clear_session() (TensorFlow) between experiments.
  7. Reduce model size. Use a smaller model variant (e.g., a smaller ResNet) or apply pruning/quantization if possible.
  8. Use memory-efficient layers. Replace layers like nn.Linear with nn.LazyLinear if you have flexibility, or use torch.utils.checkpoint to trade compute for memory.
  9. Limit PyTorch caching. Set PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128 (or a smaller value) to reduce fragmentation.
  10. Check for memory leaks. If memory grows over time, ensure you’re not keeping references to tensors in lists or outside the loop. Use del and gc.collect() if needed.
  11. Restart your session. Sometimes the GPU memory isn’t fully released after a crash. Restart your Python kernel or terminal.

Common Mistakes

  • Ignoring other processes. Web browsers, video players, and other apps can use GPU memory. Close them before training.
  • Setting batch size too high. A batch size that works on a desktop GPU may not fit on a laptop GPU with less memory.
  • Forgetting to call torch.cuda.empty_cache(). This doesn’t always free all memory, but it helps.
  • Using pin_memory=True unnecessarily. While it speeds up data transfer, it also uses extra memory. Disable it if you’re tight on memory.
  • Not checking GPU memory before starting. Always run nvidia-smi first.

Tips

  • Use nvidia-smi --query-gpu=memory.used,memory.free --format=csv to get a quick snapshot.
  • Monitor memory during training with watch -n 1 nvidia-smi (Linux) or by adding logging in your code.
  • Consider using a cloud GPU if your laptop GPU is too small for your task.
  • Update your GPU drivers and CUDA toolkit to the latest versions – they often improve memory management.
  • Use torch.cuda.memory_summary() to see detailed memory allocation.

Troubleshooting

If the error persists, try these:

  • Check if the error occurs at the very start. If so, you may be trying to allocate a huge tensor (e.g., a large embedding). Reduce its size or use a different data type.
  • Try running with CPU only to see if the issue is specific to CUDA. If it runs on CPU, it’s a memory issue.
  • Look at the full error traceback. It often shows which operation tried to allocate memory. This can guide you to the specific line to optimize.
  • If you’re using multiple GPUs (e.g., with DataParallel), ensure you’re not accidentally spreading the model across them in a way that exceeds memory.
  • For PyTorch, try setting torch.cuda.set_per_process_memory_fraction(0.5) to limit memory usage, but this may cause OOM if the model needs more.

Frequently Asked Questions

Why does my laptop GPU have less memory than advertised?

Laptop GPUs often share memory with the system, and some memory is reserved for display and system processes. The usable CUDA memory is what nvidia-smi shows.

Can I increase my GPU’s memory?

No, GPU memory is fixed hardware. You can only optimize usage, not increase it. Some laptops allow increasing shared memory, but that’s much slower and not recommended.

Why does memory usage not drop after I delete tensors?

CUDA memory is cached by the framework to avoid slow reallocation. Use torch.cuda.empty_cache() to release unused cached memory, but it may not return all memory to the OS.

Does reducing batch size always fix OOM?

Not always. If the model itself is too large, even a batch size of 1 may fail. In that case, you need a smaller model or mixed precision.

Is mixed precision safe for all models?

Mixed precision can cause numerical instability for some models. Use loss scaling (automatically handled by GradScaler) and test your model’s accuracy.

What is the difference between CUDA memory and system RAM?

CUDA memory is on the GPU itself, while system RAM is on the motherboard. The GPU can only access its own memory directly; copying data from RAM to GPU memory is slow and limited by PCIe bandwidth.

Related

General steps for current mainstream versions; menus can differ by device and version. See the disclaimer or report an error.

More in this bed

The whole Tech How-To bed →