Khởi tạo và làm việc với NVIDIA GPU Node Group
Tổng quan
NVIDIA GPU Operator là một operator giúp đơn giản hóa việc triển khai và quản lý các node GPU trong các cụm Kubernetes. Nó cung cấp một tập hợp các tài nguyên tùy chỉnh và bộ điều khiển của Kubernetes cùng làm việc để tự động hóa quản lý tài nguyên GPU trong cụm Kubernetes.
Trong hướng dẫn này, chúng tôi sẽ hướng dẫn bạn:
Khởi tạo một node group với NVIDIA GPU
Cài đặt NVIDIA GPU Operator.
Triển khai một GPU Workload.
Thiết lập GPU Sharing.
Giám sát hoạt động GPU resources.
Autoscale GPU resources.
Khởi tạo một node group với NVIDIA GPU
Ngoài ra, bạn cần đảm bảo đã cài đặt
kubectl
vàhelm
tại thiết bị của bạn.Bên cạnh đó, bạn cũng có thể cài đặt các công cụ và thư viện khác mà bạn có thể sử dụng để giám sát và quản lý tài nguyên Kubernetes của mình:
kubectl-view-allocations
plugin sử dụng để giám sát tài nguyên Kubernetes của bạn. Để biết thêm thông tin, vui lòng tham khảo thêm tại kubectl-view-allocations.
Bạn có thể thực hiện kiểm tra các cài đặt bên trên thông qua lệnh:
Trên Cluster vừa tạo, thực hiện kiểm tra node trong node group của bạn qua lệnh:
Cài đặt NVIDIA GPU Operator
Nội dung bên dưới chúng tôi sẽ trực tiếp hướng dẫn bạn cài đặt NVIDIA GPU Operator, để biết thêm thông tin về plugin này, vui lòng tham khảo thêm tại NVIDIA GPU Operator Documentation.
Trên Cluster bạn đã tạo ở bước trên, thực hiện chạy lệnh:
Hệ thống mất khoảng 5 - 10 phút để thực hiện cài đặt operator này, bạn hãy đợi tới khi việc cài đặt hoàn thành. Trong thời gian này, bạn có thể kiểm tra tất cả các pods trong namespace
gpu-operator
đang chạy thông qua lệnh:
Operator sẽ gán label
nvidia.com/gpu
cho node trong node group của bạn, lable này được NVIDIA GPU Operator sử dụng để identify nodes, bạn cũng có thể sử dụng label này để filter những node đang có NVIDIA GPU. Bạn có thể kiểm tra các node được gán nhãn này qua lệnh:
Ví dụ, đối với kết quả bên dưới, node trong cụm có label nvidia.com/gpu
, có nghĩa là node đó có GPU. Các label này cũng cho biết nút này đang sử dụng 1 card GPU RTX 2080Ti, số lượng GPU có sẵn, Bộ nhớ GPU và các thông tin khác.
Trên pod
nvidia-device-plugin-daemonset
trong namespacegpu-operator
, bạn có thể chạy lệnhnvidia-smi
để kiểm tra thông tin GPU trên node:
Triển khai một GPU workload
Deploy Cuda VectorAdd Test
Bạn có thể thực hiện deploy
cuda-vectoradd-test
như một workload mẫu trên cluster của bạn. Cụ thể bạn có thể tham khảo thêm về workload mẫu này tại cuda-vectoradd-test.yaml.Thực hiện chạy các lệnh bên dưới để deploy workload và kiểm tra các pods đã được khởi chạy:
Deploy TensorFlow Test
Ngoài Cuda VectorAdd Test, bạn cũng có thể deploy TensorFlow như một workload trên Cluster của bạn. Cụ thể bạn có thể tham khảo về workload mẫu này tại tensorflow-gpu.yaml.
Thực hiện chạy các lệnh bên dưới để deploy workload và kiểm tra các pods đã được khởi chạy:
Thiết lập GPU Sharing
GPU sharing strategies allow multiple containers to efficiently use your attached GPUs and save running costs. The following tables summarizes the difference between the GPU sharing modes supported by NVIDIA GPUs:
Chiến lược GPU Sharing cho phép nhiều containers có thể sử dụng chung một node GPU nhằm mục đích tiết kiệm chi phí của bạn. Bảng sau đây tóm tắt sự khác biệt giữa các chiến lược GPU Sharing được NVIDIA hỗ trợ:
Multi-instance GPU (MIG)
❌
Best
Processes are executed in parallel
Full isolation (dedicated memory and compute resources)
Supported by fewer GPU models (only Ampere or more recent architectures)
Coarse-grained control over memory and compute resources
Recommended for workloads running in parallel and that need certain resiliency and QoS. For example, when running AI inference workloads, multi-instance GPU multi-instance GPU allows multiple inference queries to run simultaneously for quick responses, without slowing each other down.
GPU Time-slicing
✅
None
Processes are executed concurrently
Supported by older GPU architectures (Pascal or newer)
No resource limits
No memory isolation
Lower performance due to context-switching overhead
Recommended for bursty and interactive workloads that have idle periods. These workloads are not cost-effective with a fully dedicated GPU. By using time-sharing, workloads get quick access to the GPU when they are in active phases.
GPU time-sharing is optimal for scenarios to avoid idling costly GPUs where full isolation and continuous GPU access might not be necessary, for example, when multiple users test or prototype workloads.
Workloads that use time-sharing need to tolerate certain performance and latency compromises.
Multi-process server (MPS)
✅
Medium
Processes are executed parallel
Fine-grained control over memory and compute resources allocation
No error isolation and memory protection
Recommended for batch processing for small jobs because MPS maximizes the throughput and concurrent use of a GPU. MPS allows batch jobs to efficiently process in parallel for small to medium sized workloads.
NVIDIA MPS is optimal for cooperative processes acting as a single application. For example, MPI jobs with inter-MPI rank parallelism. With these jobs, each small CUDA process (typically MPI ranks) can run concurrently on the GPU to fully saturate the whole GPU.
GPU time-slicing
GPU time-slicing là kỹ thuật chia sẻ tài nguyên GPU giữa nhiều tiến trình hoặc pod trong Kubernetes bằng cách phân bổ thời gian sử dụng GPU cho từng tiến trình theo chu kỳ.
Configure GPU time-slicing
Để sử dụng GPU time-slicing cho cluster của bạn, bạn cần tạo tệp tin
ConfigMap
theo mẫu bên dưới để định nghĩa cấu hình time-slicing. Trong đó:replicas
: field chỉ định số lượng pods có thể share chung GPU, tối đa bạn có thể thiết lập 48 pods share chung một GPU.name: mặc định nvidia.com/gpu - lable sử dụng để filter node có GPU.
minStrategy: mặc định none do GPU hiện tại chưa hỗ trợ MIG.
Hoặc bạn có thể chạy câu lệnh bên dưới để apply cấu hình trên cho tất cả các node trong cluster của bạn có lable
nvidia.com/gpu
.Sau đó, sử dụng lệnh
kubectl patch
để patch ClusterPolicy và bật GPU time-slicing. Lệnh patch chỉ hoạt động khiClusterPolicy
có trạng tháiReady
.
Verify GPU time-slicing
Bây giờ, bạn có thể deploy một application có 5 pods sử dụng GPU bằng cách apply yaml theo mấu time-slicing-verification.yaml. Bởi vì cấu hình config map thiết lập bên trên đang có replica = 4 nên pod thứ 5 sẽ có trạng thái
Pending
state.Lần lượt deploy và verify GPU time-slicing của bạn qua các lệnh:
Multi-process server (MPS)
NVIDIA Multi-Process Server (MPS) là một giải pháp thay thế và tương thích nhị phân cho giao diện lập trình ứng dụng CUDA (API). Kiến trúc runtime của MPS được thiết kế để cho phép các ứng dụng CUDA đa quy trình hợp tác, thường là các tác vụ MPI, tận dụng khả năng Hyper-Q trên các GPU NVIDIA mới nhất (Kepler và sau đó). Hyper-Q cho phép các kernel CUDA được xử lý đồng thời trên cùng một GPU, điều này có thể mang lại lợi ích về hiệu suất khi dung lượng tính toán GPU không được sử dụng đầy đủ bởi một quy trình ứng dụng duy nhất. Bạn có thể tham khảo thêm về MPS tại Multi-Process Service (MPS).
Configure MPS
Để sử dụng MPS cho cluster của bạn, bạn cần tạo tệp tin
ConfigMap
theo mẫu bên dưới để định nghĩa cấu hình MPS. Trong đó:replicas
: field chỉ định số lượng pods có thể share chung GPU.name: mặc định nvidia.com/gpu - lable sử dụng để filter node có GPU.
minStrategy: mặc định none do GPU hiện tại chưa hỗ trợ MIG.
Hoặc bạn có thể chạy câu lệnh bên dưới để apply cấu hình trên cho tất cả các node trong cluster của bạn có lable
nvidia.com/gpu
.Sau đó, sử dụng lệnh
kubectl patch
để patch ClusterPolicy và bật GPU MPS. Lệnh patch chỉ hoạt động khiClusterPolicy
có trạng tháiReady
.