Khởi tạo và làm việc với NVIDIA GPU Node Group
Last updated
Last updated
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.
Thực hiện khởi tạo một Cluster với ít nhất một node group sử dụng NVIDIA GPU theo hướng dẫn tại nếu bạn muốn khởi tạo public node group hoặc tại nếu bạn muốn khởi tạo private node group.
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 .
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:
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 namespacegpu-operator
đang chạy thông qua lệnh:
Operator sẽ gán labelnvidia.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ệnh nvidia-smi
để kiểm tra thông tin GPU trên node:
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:
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:
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ợ:
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ỳ.
Để 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 khi ClusterPolicy
có trạng thái Ready
.
Lần lượt deploy và verify GPU time-slicing của bạn qua các lệnh:
Để 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 khi ClusterPolicy
có trạng thái Ready
.
Lần lượt deploy và verify GPU MPS của bạn qua các lệnh:
Nếu bạn có một node group gồm nhiều node GPU, bạn có thể sử dụng hai chiến lược khác nhau trên hai node riêng biệt. Ví dụ: bạn có thể sử dụng Time Slicing trên một node để chia sẻ GPU và sử dụng MPS trên node còn lại để chia sẻ GPU cho các ứng dụng khác. Ví dụ, tôi đã tạo 2 node group trong một Cluster với các thông số như sau:
NodeGroup 1 có instance GPU RTX 2080Ti.
NodeGroup 2 có instance GPU RTX 4090.
Hiện tại, bạn mong muốn:
NodeGroup 1 có instance GPU RTX 2080Ti sẽ chạy 4 pods sharing GPU sử dụng time-slicing.
NodeGroup 2 có instance GPU RTX 4090 sẽ chạy 8 pods sharing GPU sử dụng MPS.
Để sử dụng GPU time-slicing, 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 time-slicing, MPS mong muốn.
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, MPS. Lệnh patch chỉ hoạt động khi ClusterPolicy
có trạng thái Ready
.
Bây giờ, bạn cần thêm label cho node với tên mà bạn chỉ định tại trong file ConfigMap
:
Giám sát tài nguyên GPU NVIDIA trong cụm Kubernetes là điều cần thiết để đảm bảo hiệu suất tối ưu, sử dụng tài nguyên hiệu quả và giải quyết vấn đề một cách chủ động. Sau đây là hướng dẫn của chúng tôi về việc thiết lập và sử dụng Prometheus và NVIDIA Data Center GPU Manager (DCGM) để giám sát tài nguyên GPU trong môi trường Kubernetes.
Đầu tiên, bạn cần cài đặt Prometheus Stack và Prometheus Adapter để tích hợp với Kubernetes API server qua lệnh:
Sau khi cài đặt thành công, chạy lệnh bên dưới để kiểm tra các resource Prometheus đang chạy:
Tiếp theo, bạn cần chạy lệnh bên dưới để enable DCGM exporter để giám sát GPU resources trên cluster của bạn:
Bảng 1: Usage
DCGM_FI_DEV_GPU_UTIL
Gauge
Percentage
GPU usage.
DCGM_FI_DEV_MEM_COPY_UTIL
Gauge
Percentage
Memory usage.
DCGM_FI_DEV_ENC_UTIL
Gauge
Percentage
Encoder usage.
DCGM_FI_DEV_DEC_UTIL
Gauge
Percentage
Decoder usage.
Bảng 2: Memory
DCGM_FI_DEV_FB_FREE
Gauge
MB
Number of remaining frame buffers. The frame buffer is called VRAM.
DCGM_FI_DEV_FB_USED
Gauge
MB
Number of used frame buffers. The value is the same as the value of memory-usage in the nvidia-smi command.
Bảng 3: Temperature and power
DCGM_FI_DEV_GPU_TEMP
Gauge
°C
Current GPU temperature of the device.
DCGM_FI_DEV_POWER_USAGE
Gauge
W
Power usage of the device.
Để enable autoscaling GPU Resource, bạn cần:
Nếu BẠN KHÔNG cài đặt Keda trong cụm của mình, tính năng Auto-scale của VKS sẽ can thiệp vào và:
Phát hiện các pod đang ở trạng thái chờ (Pending).
Tự động mở rộng Nodegroup chứa GPU để xử lý các pod này.
Điều này xảy ra khi số replica Deployment lớn hơn số GPU khả dụng mà bạn đã cấu hình trong ConfigMap.
Nếu BẠN CÓ cài đặt Keda trong cụm của mình, bạn có thể sử dụng ScaledObject
để scale GPU Nodegroup dựa trên metrics mà bạn mong muốn. Ví dụ, bạn có thể scale GPU Nodegroup dựa trên GPU usage, memory usage hoặc các metrics khác. Ví dụ:
Cấu hình này điều chỉnh số lượng GPU trong Nodegroup dựa trên GPU usage và memory usage. Trong đó:
Fieldquery
chỉ định truy vấn để lấy số liệu từ Prometheus.
Fieldthreshold
chỉ định giá trị ngưỡng để điều chỉnh số lượng GPU trong Nodegroup.
Field minReplicaCount
và maxReplicaCount
chỉ định số lượng tối thiểu và tối đa mà Nodegroup GPU có thể điều chỉnh đến.
Khi trạng thái ScaledObject
Ready làTrue
, GPU Nodegroup được scale dựa trên GPU usage.
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 .
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 .
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 .
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 . 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.
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 .
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 . 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.
Bên dưới đây là câu lệnh chúng tôi hướng dẫn bạn training MNIST model trong TensorFlow sử dụng 2 node GPU RTX 2080Ti và RTX 4090. Node RTX 2080Ti sẽ được share chung cho 4 pods sử dụng Time-slicing và node RTX 4090 sẽ được share chung cho 8 pods sử dụng MPS. Tham khảo thêm về TensorFlow tại .
Bây giờ, bạn hãy chạy lệnh bên dưới để chuyển Prometheus Adapter tới máy localhost của bạn và sau đó kiểm tra các metrics đã thu thập được thông qua
Bên dưới là danh sách một vài GPU Metrics được sử dụng thường xuyên. Tham khảo danh sách GPU metric đầy đủ tại .
Bật tính năng Autoscale cho GPU Nodegroups theo hướng dẫn tại .
Cài đặt thông qua Helm chart trên Cluster của bạn qua lệnh:
Apply manifest to generate resources for testing the autoscaling feature. This manifest run 1 pod of CUDA VectorAdd Test and the GPU Nodegroup will be scaled to 3 when the GPU usage is greater than 50%.
Thực hiện apply tệp tin để generate resources sử dụng verify cho tính năng autoscaling:
Tiếp tục thực hiện apply tệp tin để tạo ScaleObject
cho deplyment của bạn:
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.
Workloads that use CUDA MPS need to tolerate the .