Chia sẻ GPU Kubernetes với rào VRAM từ CUDA 13.4 và KAI Scheduler
CUDA 13.4 bổ sung cơ chế cưỡng chế ranh giới bộ nhớ GPU theo workload. Kết hợp GPU Fractioning Operator và KAI Scheduler, đội vận hành có thể chia một GPU cho nhiều Pod với hạn mức VRAM và chế độ chia compute theo từng container.
Một Pod inference chỉ cần một phần VRAM nhưng vẫn phải giữ trọn GPU là tình huống dễ gặp trong cụm AI nội bộ. Hệ quả là GPU có thể còn tài nguyên nhàn rỗi, trong khi workload khác vẫn không được lên lịch.
CUDA 13.4 bổ sung cơ chế cưỡng chế ranh giới bộ nhớ GPU theo workload. Khi kết hợp với GPU Fractioning Operator và KAI Scheduler, Kubernetes có thể chia một GPU cho nhiều workload mà vẫn áp hạn mức VRAM theo từng container.
Điểm đáng chú ý không chỉ là “cùng dùng GPU”. Mỗi workload có thể nhận một mức bộ nhớ chính xác, hoặc một mức tối thiểu kèm trần có thể tăng thêm khi GPU còn bộ nhớ rảnh.
Ba thành phần của cơ chế chia GPU
CUDA 13.4: thực thi ranh giới bộ nhớ
CUDA 13.4 đưa cơ chế giới hạn bộ nhớ GPU theo cách minh bạch với ứng dụng. Workload chỉ thấy phần bộ nhớ được cấp cho mình thay vì toàn bộ bộ nhớ của GPU vật lý.
Có hai cách thiết lập:
Giới hạn chính xác: workload yêu cầu bao nhiêu bộ nhớ thì bị giới hạn ở mức đó. Cấp phát vượt ngưỡng sẽ thất bại tương tự khi ứng dụng chạy trên GPU nhỏ hơn.
Khoảng bộ nhớ: workload có mức bộ nhớ được bảo đảm và có thể tăng đến một trần cao hơn khi bộ nhớ còn rảnh.
CUDA cũng cho phép chọn cách chia compute: time-slicing hoặc sm-sharing.
GPU Fractioning Operator: thực thi ở node
GPU Fractioning Operator là Kubernetes operator mã nguồn mở, được đặt dưới tổ chức KAI Scheduler trên GitHub. Operator này chạy cùng NVIDIA GPU Operator, thành phần phụ trách driver và thiết lập container runtime.
Trên mỗi GPU node, GPU Fractioning Operator thực hiện ba nhiệm vụ:
Thiết lập và giám sát NVIDIA Multi-Process Service (MPS).
Áp hạn mức bộ nhớ và compute mode cho workload trước khi tiến trình khởi chạy.
Đo mức dùng memory và compute theo từng GPU fraction thay vì chỉ theo toàn bộ GPU.
KAI Scheduler: chọn GPU và ghi cấu hình
KAI Scheduler v0.18.0 là scheduler đầu tiên tích hợp với GPU Fractioning Operator thông qua chế độ NvFractions.
Scheduler chọn GPU hoặc phần GPU phù hợp cho workload, sau đó ghi thông tin cấp phát vào annotation của từng container trong Pod. GPU Fractioning Operator đọc các annotation này trên node để áp cấu hình tương ứng.
VRAM và compute được kiểm soát thế nào?
Các annotation mà GPU Fractioning Operator sử dụng gồm:
| Annotation | Ý nghĩa |
|---|---|
| nvidia.com/container.<name>.gpu-memory.request | Bộ nhớ GPU được bảo đảm |
| nvidia.com/container.<name>.gpu-memory.limit | Mức bộ nhớ GPU tối đa container có thể tăng tới |
| nvidia.com/container.<name>.gpu-compute.mode | Chế độ time-slicing hoặc sm-sharing |
| nvidia.com/container.<name>.gpus.devices | GPU được gán cho container |
Tên container là một phần của annotation key. Với Pod nhiều container, cần bảo đảm annotation nhắm đúng container sử dụng GPU.
Nếu không khai báo limit, giới hạn tối đa sẽ bằng request: workload xin bao nhiêu thì bị giới hạn ở mức đó. Nếu có limit, workload có thể tăng dùng bộ nhớ từ mức bảo đảm đến mức trần khi GPU còn bộ nhớ rảnh.
Hai chế độ chia compute
CUDA cho phép workload chọn một trong hai chế độ chia compute.
Time-slicing
time-slicing là chế độ mặc định. Các workload lần lượt sử dụng GPU theo lát thời gian. Khi có n workload đều hoạt động, mỗi workload nhận xấp xỉ 1/n thời gian compute.
Theo NVIDIA, các workload trong chế độ này có error isolation đầy đủ: chúng không nằm cùng error domain.
SM-sharing
Với sm-sharing, các workload chạy song song và chia sẻ streaming multiprocessors (SM). Khi mọi workload đều bận, phần compute mỗi bên nhận được cũng có thể xấp xỉ 1/n.
Nếu một workload ít hoạt động, workload khác có thể sử dụng phần SM còn lại. Đổi lại, các workload dùng chung một error domain.
Một GPU dùng chung chỉ chạy một compute mode tại một thời điểm. KAI Scheduler được thiết kế để không đặt workload time-slicing và sm-sharing trên cùng GPU. Việc theo dõi này diễn ra ở cấp GPU, vì vậy một node nhiều GPU vẫn có thể chạy các mode khác nhau trên các GPU khác nhau.
Bật NvFractions với KAI Scheduler
NVIDIA công bố ví dụ bật KAI Scheduler với NvFractions bằng Helm:
bash
helm upgrade -i kai-scheduler oci://ghcr.io/kai-scheduler/kai-scheduler/kai-scheduler \
-n kai-scheduler --create-namespace \
--set global.nvFractions.set=true
Theo mô tả, GPU Fractioning Operator được cài như một dependency. Sau đó, workload có thể khai báo nhu cầu GPU qua annotation trong Pod YAML.
Có hai cách mô tả lượng bộ nhớ yêu cầu:
Dung lượng tuyệt đối, theo đơn vị Kubernetes chuẩn, chẳng hạn Gi.
Tỷ lệ của một GPU thông qua annotation KAI Scheduler:
yaml
gpu-fraction: "0.5"
Có thể đặt compute mode theo từng container:
yaml
nvidia.com/container.app.gpu-compute.mode: "sm-sharing"
Hoặc dùng time-slicing:
yaml
nvidia.com/container.app.gpu-compute.mode: "time-slicing"
Để sử dụng phần GPU trên nhiều thiết bị, có thể khai báo:
yaml
gpu-fraction-num-devices: "4"
Cần lưu ý rằng request áp dụng trên mỗi GPU. Ví dụ, request 40Gi với bốn thiết bị có nghĩa workload nhận 40Gi trên từng GPU được gán, không phải 40Gi cho cả bốn GPU cộng lại.
Khai báo request và giới hạn burst
Với request theo dung lượng tuyệt đối, annotation giới hạn có dạng:
yaml
nvidia.com/container.<c>.gpu-memory.limit: "80Gi"
Nếu request sử dụng tỷ lệ GPU, giới hạn tương ứng dùng annotation:
yaml
kai.scheduler/container.<c>.gpu-memory.portion.limit: "0.8"
Giá trị limit theo tỷ lệ phải lớn hơn gpu-fraction và nhỏ hơn 1. Nếu không cần khả năng burst, không khai báo limit để hệ thống giới hạn workload đúng bằng request.
Lưu ý khi vận hành cụm nội bộ
GPU fractioning bổ sung kiểm soát VRAM, nhưng scheduler vẫn cần chọn GPU còn đủ bộ nhớ và không trộn các compute mode không tương thích trên cùng thiết bị.
Một số điểm đội vận hành nên theo dõi:
Phân biệt request và burst: request là phần bộ nhớ được bảo đảm; burst chỉ khả dụng khi GPU còn bộ nhớ rảnh.
Tránh đặt trần burst quá rộng cho mọi workload: nhiều workload đồng thời tăng mức dùng bộ nhớ sẽ thu hẹp phần dung lượng còn lại để lên lịch workload mới.
Theo dõi theo GPU fraction: operator được thiết kế để đo mức dùng memory và compute theo từng phần GPU, thay vì chỉ theo GPU vật lý.
Thử nghiệm trước khi mở rộng: nên xác minh hành vi khi workload chạm giới hạn bộ nhớ, cũng như cách scheduler xử lý các compute mode khác nhau.
Kết luận
CUDA 13.4 bổ sung phần còn thiếu cho GPU sharing trên Kubernetes: không chỉ chia GPU, mà còn cưỡng chế giới hạn bộ nhớ theo workload.
GPU Fractioning Operator đảm nhiệm việc thực thi trên node, còn KAI Scheduler với chế độ NvFractions chọn GPU, ghi annotation cấp phát và tránh trộn các compute mode không tương thích. Đây là hướng đáng cân nhắc cho các cụm có nhiều workload AI nhỏ, đặc biệt khi mục tiêu là tận dụng tốt hơn GPU hiện có mà vẫn kiểm soát được VRAM theo từng container.