Nếu bạn là nhà phát triển ứng dụng hoặc quản trị viên hệ thống cluster, bạn có thể đã thấy cách mà kiến trúc truy cập bộ nhớ bất đồng dạng – Non-uniform Memory Access (NUMA) – có thể ảnh hưởng đến hiệu suất hệ thống như thế nào. Khi một ứng dụng không hoàn toàn nhận thức về NUMA, hiệu suất có thể không nhất quán và khó lường trước.
Chính vì những thách thức này, NVIDIA đã phát hành cơ chế quản lý bộ nhớ dựa trên trình điều khiển đồng nhất – Coherent Driver-based Memory Management (CDMM) – cho trình điều khiển (driver) phần cứng trên các nền tảng nhất quán phần cứng (hardware-coherent), chẳng hạn như GH200, GB200 và GB300. CDMM cho phép trình driver NVIDIA, thay vì hệ điều hành, kiểm soát và quản lý bộ nhớ GPU. Điều này cho phép ứng dụng kiểm soát chi tiết hơn nhiều để đưa dữ liệu vào không gian bộ nhớ phù hợp và sau đó khai thác hiệu suất tối đa.
Bài viết này sẽ mô tả sự khác biệt giữa NUMA và CDMM, cũng như cách chúng tác động đến hiệu suất ứng dụng. Bạn có thể tham khảo thêm bài báo cáo chuyên sâu về chủ đề này để biết thêm thông tin.
NUMA là gì?
NUMA mode là chế độ mặc định hiện tại cho các driver của NVIDIA trên các nền tảng hardware coherent. NUMA cung cấp toàn bộ bộ nhớ CPU (máy chủ) và bộ nhớ GPU (thiết bị) cho hệ điều hành. Có nghĩa là các API Linux tiêu chuẩn như malloc và mmap, cũng như API CUDA, có thể phân bổ bộ nhớ trên cả CPU và GPU. Nó cũng hỗ trợ di chuyển bộ nhớ động giữa CPU và GPU thông qua các API ở không gian người dùng, hoặc tự động bởi kernel để tối ưu hóa việc sử dụng tài nguyên.
Tuy nhiên, một tác dụng ngược quan trọng cần cân nhắc là NUMA mode sẽ khiến bộ nhớ GPU được nhìn thấy như một nhóm bộ nhớ chung, nghĩa là khả năng cô lập nghiêm ngặt bộ nhớ GPU khỏi các chức năng chung của hệ điều hành bị hạn chế. Trong hoạt động thông thường của NUMA, bộ nhớ có thể tràn sang GPU, điều đó có thể dẫn đến kết quả không mong muốn với hiệu suất ứng dụng.
Đó là lý do tại sao NVIDIA cung cấp một giải pháp thay thế: Chế độ Quản lý bộ nhớ dựa trên trình điều khiển nhất quán (CDMM).
Nền tảng phần cứng nhất quán là gì?
Một số hệ thống NVIDIA – bao gồm GH200, GB200 và GB300 – có kết nối NVLink chip-to-chip (C2C) trực tiếp giữa CPU và GPU. Điều này mở ra một khả năng mạnh mẽ không có trên các hệ thống kết nối PCIe: bộ nhớ nhất quán phần cứng. Nó cho phép cả bộ nhớ CPU và GPU được truy cập trực tiếp từ một trong hai bộ xử lý.
Điều đó có thể gây ra một số hậu quả không mong muốn cho các ứng dụng dựa trên các hành vi nào đó của NUMA. Cụ thể, hệ điều hành có thể chọn bộ nhớ GPU cho các mục đích sử dụng bất ngờ hoặc không mong muốn, chẳng hạn như file caching hoặc tránh tình huống out-of-memory (OOM) từ yêu cầu phân bổ. Đối với một số ứng dụng và quy trình làm việc, đặc biệt là những ứng dụng và quy trình đã được tối ưu hóa cho một kiểu bố trí bộ nhớ CPU và GPU cụ thể (như Kubernetes), những khác biệt này có thể không mong muốn.
Chế độ CDMM mới sẽ giải quyết những thách thức này và đặc biệt hữu ích cho các ứng dụng như Kubernetes.
NUMA tác động đến Kubernetes như thế nào
Vì Kubernetes là một phương pháp phổ biến để vận hành các cụm GPU lớn, nên có một số hành vi cụ thể và bất ngờ có thể xảy ra khi chạy Kubernetes ở chế độ NUMA. Những hành vi này có thể ảnh hưởng đến hiệu suất và thậm chí là chức năng của ứng dụng.
- Báo cáo quá mức bộ nhớ: Kubernetes sẽ ghi nhận không đúng bộ nhớ GPU vào số lượng bộ nhớ hệ thống, dẫn đến các pod yêu cầu nhiều bộ nhớ hơn mức khả dụng và gây ra lỗi OOM.
- Giới hạn bộ nhớ pod áp dụng cho bộ nhớ GPU, không chỉ bộ nhớ hệ thống: Giới hạn bộ nhớ pod của Kubernetes, được thiết kế cho bộ nhớ hệ thống, áp dụng không chính xác cho cả bộ nhớ hệ thống và GPU khi sử dụng bộ nhớ được phân bổ bởi hệ thống, vì mỗi GPU được hiển thị dưới dạng một nút NUMA. Điều này vi phạm hợp đồng API Pod spec dự kiến.
- Cô lập bộ nhớ GPU giữa các pod: Theo mặc định, các pod Kubernetes có thể truy cập tất cả bộ nhớ trên các node NUMA, bao gồm cả bộ nhớ GPU. Điều này cho phép các container phân bổ bộ nhớ trên các GPU mà chúng không có quyền truy cập, phá vỡ tính cô lập.
Vì những lý do này, chúng tôi khuyên bạn nên sử dụng chế độ CDMM khi sử dụng Kubernetes.
CDMM là gì?
CDMM là một chế độ hoạt động thay thế trên trình điều khiển thiết bị của NVIDIA, ngăn bộ nhớ GPU bị hệ điều hành khai thác như một node NUMA phần mềm. Thay vào đó, trình điều khiển thiết bị NVIDIA trực tiếp quản lý bộ nhớ GPU, tách biệt nó khỏi bộ nhớ hệ thống của CPU. Phương pháp này được lấy cảm hứng từ mô hình GPU gắn PCIe, trong đó bộ nhớ GPU tách biệt với bộ nhớ hệ thống.
Ở chế độ CDMM, bộ nhớ CPU được quản lý bởi Linux kernel và bộ nhớ GPU được quản lý bởi trình điều khiển NVIDIA. Điều này có nghĩa là chính trình điều khiển NVIDIA, chứ không phải hệ điều hành, chịu trách nhiệm quản lý bộ nhớ GPU và có toàn quyền kiểm soát cách sử dụng bộ nhớ GPU, do đó mang lại khả năng kiểm soát tốt hơn và thường mang lại hiệu suất ứng dụng tốt hơn.
CDMM ảnh hưởng đến các nhà phát triển CUDA như thế nào
Tác động chính của CDMM nằm ở việc di chuyển bộ nhớ được phân bổ của hệ thống. Trong triển khai CDMM hiện tại, bộ nhớ được phân bổ của hệ thống sẽ không được di chuyển sang GPU. GPU vẫn có thể truy cập bộ nhớ được phân bổ của hệ thống qua liên kết C2C, nhưng các trang bộ nhớ sẽ không được di chuyển.
Ví dụ, khi một ứng dụng sử dụng gợi ý để khuyến khích di chuyển bằng các hàm như cudaMemPrefetchAsync(), cudaMemPrefetchBatchAsync(), cudaMemDiscardAndPrefetchBatchAsync(), và cudaMemAdvise(SetPreferredLocation), thì các trang sẽ không di chuyển.
CDMM ảnh hưởng đến quản trị hệ thống như thế nào
Khi hệ thống ở chế độ CDMM, vẫn sẽ có các node NUMA tương ứng với GPU, nhưng chúng sẽ không cung cấp bất kỳ bộ nhớ nào cho hệ điều hành. Việc sử dụng các công cụ như numactl hoặc mbind sẽ không có tác dụng gì khi áp dụng cho bộ nhớ GPU. Chúng tôi khuyến nghị KHÔNG sử dụng các công cụ này ở chế độ CDMM cho bất kỳ hoạt động quản lý bộ nhớ GPU nào. Chúng vẫn có thể được sử dụng để quản lý bộ nhớ hệ thống.
CDMM hiện là chế độ mặc định cho các triển khai GPU dựa trên Kubernetes bắt đầu từ trình điều khiển Linux 580.65.06 trở lên. Để bật CDMM, bạn cần truyền tham số và giá trị của kernel module khi trình điều khiển được tải. Để biết lệnh và cú pháp chính xác để bật chế độ CDMM, vui lòng đọc thêm CDMM whitepaper .
Hướng dẫn sử dụng CDMM và NUMA
Phần sau đây nêu bật những khác biệt chính giữa chế độ CDMM và NUMA, cũng như thời điểm nên cân nhắc sử dụng chế độ này hay chế độ kia.
Quản lý bộ nhớ dành riêng cho ứng dụng
- Chế độ NUMA: Tốt nhất cho các ứng dụng sử dụng API NUMA của hệ điều hành và dựa vào khả năng quản lý tổng bộ nhớ hệ thống của hệ điều hành (bộ nhớ CPU + bộ nhớ GPU).
- Chế độ CDMM: Lý tưởng cho các ứng dụng cần điều khiển bộ nhớ GPU trực tiếp, bỏ qua hệ điều hành.
Memory Pooling
- Chế độ NUMA: Cho phép bộ nhớ GPU và CPU tạo thành một nhóm lớn hơn. tải xử lý được hưởng lợi từ việc quản lý băng thông và bộ nhớ tổng hợp.
- Chế độ CDMM: Do trình điều khiển quản lý, ngăn hệ điều hành sử dụng bộ nhớ GPU trong một nhóm lớn hơn. Bộ nhớ GPU được dành riêng cho dữ liệu dành riêng cho GPU.
Sử dụng bộ nhớ GPU: khả năng hiển thị và đo lường
- Chế độ NUMA: Các công cụ tiêu chuẩn báo cáo mức sử dụng bộ nhớ GPU trong nhóm tích hợp, có thể lọc theo NUMA, do đó cung cấp chế độ xem tổng thể bộ nhớ hệ thống.
- Chế độ CDMM: Cung cấp khả năng kiểm soát chi tiết và khả năng hiển thị bộ nhớ GPU. Bộ nhớ GPU do trình điều khiển quản lý giúp quản trị viên và nhà phát triển hiểu rõ mức tiêu thụ tài nguyên để chẩn đoán và tối ưu hóa hiệu suất.
Bảng tóm tắt
Bảng sau đây nêu bật những khác biệt chính về cách xử lý bộ nhớ giữa chế độ NUMA và CDMM.
NUMA | CDMM | |
Quản lý bộ nhớ | Hệ điều hành quản lý cả CPU và GPU | Hệ điều hành quản lý CPU, trình điều khiển NVIDIA quản lý GPU |
Tiếp xúc bộ nhớ GPU | Tiếp xúc với hệ điều hành như một nhóm chung | Không tiếp xúc với hệ điều hành để sử dụng |
Di chuyển bộ nhớ | Di chuyển động bộ nhớ được phân bổ của hệ thống giữa CPU và GPU | Bộ nhớ được phân bổ cho hệ thống KHÔNG được di chuyển sang GPU |
Bảng 1. Tóm tắt sự khác biệt về hành vi bộ nhớ giữa chế độ NUMA và CDMM
Bằng cách hiểu và triển khai CDMM một cách chiến lược, các nhà phát triển và quản trị viên có thể khai thác toàn bộ tiềm năng của kiến trúc bộ nhớ nhất quán phần cứng NVIDIA, đảm bảo hiệu suất và khả năng kiểm soát tối ưu cho tải xử lý được tăng tốc bằng GPU.
Nếu bạn đang sử dụng các nền tảng phần cứng nhất quán như GH200, GB200 hoặc GB300, hãy xem whitepaper. Và hãy cân nhắc bật chế độ CDMM để cho phép ứng dụng kiểm soát sâu đối với bộ nhớ GPU, đặc biệt nếu bạn đang sử dụng Kubernetes.
Bài viết liên quan
- ASUS chính thức lên kệ chiếc siêu máy tính AI ASCENT GX10 dựa trên DGX Spark
- NVIDIA DGX Spark bắt đầu đến tay các nhà phát triển AI trên toàn thế giới
- Kiến trúc NVIDIA Blackwell với GB200 NVL72: Định nghĩa lại điện toán AI cấp độ Exascale
- Huấn luyện mô hình hàng trăm tỷ tham số ngay tại bàn với MSI EdgeXpert
- Đánh giá chi tiết NVIDIA RTX Pro 6000 Blackwell Workstation: GPU máy trạm với 96GB GDDR7