0

[GPU in AI] Bài 9: GPU memory hoạt động trong PyTorch

Ở bài này mình sẽ nói về 2 khái niệm khá quan trọng trong Pytorch GPU memory là Allocated - Reserved

Allocated - Reserved

Untitled-2026-01-11-2115.png

Allocated memory: là GPU memory đang thực sự được tensor sử dụng tại thời điểm hiện tại.

Tạo tensor => Allocated tăng

Xóa tensor => Allocated giảm

Chúng ta có thể kiểm tra bằng: torch.cuda.memory_allocated()

Reserved memory: là tổng GPU memory mà PyTorch gọi thông qua CUDA API ( backend: cudaMallocAsync). Reserved gồm Allocated (memory đang được tensor sử dụng) và cả Cached memory — tức là các block đã từng được sử dụng nhưng hiện chưa có tensor nào giữ.

Mục đích của cache là để tái sử dụng các block này cho những lần sau, thay vì phải gọi lại CUDA API để cấp phát bộ nhớ. Vì vậy, khi một tensor bị xóa, phần memory của nó sẽ không được trả ngay về CUDA, mà được chuyển sang trạng thái cached để phục vụ cho các tác vụ sau.

Chúng ta có thể kiểm tra bằng: torch.cuda.memory_reserved()

Other: Là phần GPU memory không do PyTorch quản lý. Bao gồm:

  • CUDA context (được tạo khi khởi tạo CUDA)
  • Các thư viện backend như cuDNN, cuBLAS, NCCL…
  • Các process khác đang sử dụng GPU

Vì không nằm trong quyền kiểm soát của Pytorch nên: không thể giải phóng được bằng del hoặc empty_cache() và vẫn hiển thị trong nvidia-smi

Demo

image.png

Các bạn có thể thử đổi thứ tự của del và empty_cache() để hiểu rõ hơn cách memory hoạt động

image.png

image.png

Ở đây các bạn có thể thấy after cleanup = after matmul - before matmulquan trọng là thay đổi before matmul thì after cleanup vẫn như cũ là vì other ( cụ thể ở đây là CuBLAS ) và như mình đã nói là other vẫn còn hiện thị trên nvidia-smi

image.png

Ở đây là vì other không thuộc quyền kiểm soát của Pytorch nên memory khi xem bằng Pytorch và nvidia-smi sẽ khác nhau

Các bạn có thể tìm hiểu sâu hơn ở đây


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí