09 · Theo dõi bộ nhớ, utilization và công suất GPU
Nguồn: fanout.sh / inference-eng / 01-04 · ~8 phút
Ghi chú
Dashboard GPU hiển thị ba con số: bộ nhớ, utilization, công suất. Cả ba đều đúng và cả ba thường bị đọc sai. Bộ nhớ đã dùng gồm trọng số + pool được framework cache + KV cache + phần driver giữ lại, và các engine cố ý đặt trước phần lớn card. Utilization là một chu kỳ làm việc (duty cycle: có kernel nào đang chạy không?), không phải mức bão hoà. Công suất dưới mức trần là bình thường với decode bị giới hạn bởi bộ nhớ; chạm trần và quá nhiệt hiện ra trong lý do hạ xung nhịp. Đọc theo đúng thứ tự đó, rồi đo so với một mức sàn.
Ví dụ xuyên suốt: Llama 3.1 8B trên một H100. Mỗi chỉ số, cách đọc sai thường gặp, và ý nghĩa thật của nó.
1. Bộ nhớ: những gì driver đã cấp ra
"Used" trên dashboard là tổng của bốn thứ:
- Trọng số: 16 GB với model này.
- Pool của framework: caching allocator của PyTorch giữ lại bộ nhớ đã giải phóng cho chính nó (không trả cho driver) để lần cấp phát sau nhanh hơn. Tài liệu PyTorch nói bộ nhớ chưa dùng do allocator quản lý vẫn hiện là đã dùng trên dashboard.
- KV cache: tăng theo từng token của mọi cuộc hội thoại đang mở, ở đây là 128 KiB mỗi token.
- Phần driver giữ lại: bộ nhớ driver giữ cho mình (API gọi là reserved for system use).
"Used" trên dashboard ⊇ PyTorch reserved (pool) ⊇ PyTorch allocated (tensor đang sống).
torch.cuda.memory_allocated()= phần tensor đang giữ;memory_reserved()= phần pool đang giữ. Khoảng chênh là cache;torch.cuda.empty_cache()trả nó lại (hữu ích khi một process khác cần card).
Khi chạy dưới một inference engine
--gpu-memory-utilization của vLLM mặc định là 0.92: nó chiếm 92% card ngay khi khởi động, trước cả khi có request nào, và biến mọi thứ phía trên phần trọng số thành các block KV cache để phục vụ được càng nhiều cuộc hội thoại càng tốt. Không có gì bị rò rỉ; engine đặt chỗ trước.
Nhận biết bằng hình dạng: nhảy bậc lúc khởi động rồi đi ngang (engine), leo chậm (KV trong các cuộc hội thoại dài), hoặc mức nền cứ tăng dù request đã kết thúc (rò rỉ).
2. Utilization: một duty cycle
Định nghĩa của NVIDIA, diễn đạt lại: phần trăm thời gian trong chu kỳ lấy mẫu gần nhất mà có một hoặc nhiều kernel đang chạy. Hãy đọc nó như một duty cycle; cửa sổ dài từ 1/6 giây tới 1 giây.
Một kernel chiếm một SM trong suốt cửa sổ là đã đọc ra 100%; metric này không nói gì về việc bao nhiêu trong 132 SM đang bận.
- Nó không cho biết bao nhiêu trong 132 SM đang bận, cũng không cho biết dùng bao nhiêu băng thông bộ nhớ.
- Vì vậy một người dùng decode ở ~4,8 ms/token có thể ghim utilization ở 100% trong khi các đơn vị số học phần lớn thời gian ngồi chờ trọng số.
- Memory utilization cũng là một duty cycle tương tự cho bus bộ nhớ: tỷ lệ thời gian bus đang đọc hoặc ghi, không phải nó đã chuyển bao nhiêu.
"Đủ bận" cần một phép đo khác
So những gì GPU đã làm với những gì nó có thể làm: byte đã chuyển ÷ băng thông đỉnh (MBU) và phép tính ÷ khả năng tính toán đỉnh (MFU).
Cùng decode một người dùng: utilization 100%, dùng băng thông cao, tính toán chỉ một chút.
Quan trọng
Utilization 100% nghĩa là có thứ gì đó đang chạy. Không có nghĩa là không chạy thêm được gì nữa.
3. Công suất: ba con số chung một nhãn
Công suất tiêu thụ so với giới hạn được yêu cầu và giới hạn được áp dụng; khi chạm trần, GPU hạ xung nhịp và ghi lại lý do.
- Power draw: lần đo gần nhất của công suất cả board đang kéo (watt).
- Power limit: mức trần phần mềm yêu cầu. Enforced limit: mức trần phần cứng thực sự áp dụng. Một H100 SXM có thể cấu hình lên tới 700 W.
- Khi chạm trần, GPU hạ xung nhịp và ghi lý do vào clocks event reasons (ví dụ SW Power Cap).
- Decode một người dùng cho utilization đầy nhưng chỉ khoảng một nửa mức trần công suất, và điều đó nhất quán: decode bị giới hạn bởi băng thông, nên các đơn vị tính toán đốt rất ít. Đo được: giới hạn H100 từ 700 → 350 W gần như không làm thay đổi throughput decode (Splitwise).
Mẹo
Công suất tiêu thụ cho biết GPU đang tiêu bao nhiêu, không cho biết nó đang làm việc vất vả tới đâu.
Hai trường nữa giải thích những lần chậm bí ẩn
- Nhiệt độ: vượt giới hạn thì SW thermal slowdown cắt xung nhịp; HW slowdown có thể giảm một nửa xung nhịp.
- Performance state: P0 = tốc độ tối đa … P12 = nghỉ; card bị kẹt ở số cao là đang bị kìm lại.
4. Đọc dashboard theo thứ tự
Bộ nhớ → utilization → công suất và xung nhịp → rồi đo xem nó chạy tốt tới đâu so với một mức sàn.
Nếu throughput giảm mà lưu lượng không đổi, hãy kiểm tra công suất, nhiệt độ và P-state trước khi mở profiler.
5. Tóm tắt
