Skip to main content

NCA-AIIO 6: GPUDirect, công cụ AI và NCCL nâng cao

Cập nhật: 2026-07-09

Mục lục


1. NVIDIA GPUDirect — họ công nghệ truy cập trực tiếp GPU

NVIDIA GPUDirect là một họ công nghệ cho phép đọc và ghi trực tiếp vào GPU, bao gồm: GPUDirect Storage, GPUDirect RDMA, và GPUDirect Peer-to-Peer. Trong số này, phần quan trọng nhất cần nắm là GPUDirect RDMAGPUDirect Storage — hai công nghệ sẽ được đi sâu ở các phần tiếp theo.

2. GPUDirect RDMA

GPUDirect RDMA (Remote Direct Memory Access) cho phép giao tiếp trực tiếp giữa các GPU, bỏ qua hoàn toàn CPU, mang lại hiệu năng gấp 10 lần. Đây là phiên bản RDMA "riêng" của NVIDIA cho phần cứng của họ, cho phép giao tiếp GPU-to-GPU giữa các node (không chỉ trong cùng một máy). Ví dụ hình dung: các GPU ở hai đầu mạng dùng ConnectX, kết nối qua InfiniBand với RDMA để đạt tốc độ siêu nhanh — hoàn toàn bỏ qua CPU và bộ nhớ CPU.

GPUDirect RDMA được giới thiệu lần đầu trên GPU dòng Kepler, cùng với CUDA 5, vào năm 2012 — nên công nghệ này đã tồn tại khá lâu. GPUDirect RDMA hỗ trợ đầy đủ InfiniBand NDR (500 Gb/s) — nhớ rằng tốc độ thực tế còn phụ thuộc vào loại cáp đang dùng (200 hay 400). H100 có thể hỗ trợ NDR400. GPUDirect RDMA không bị giới hạn bởi thế hệ InfiniBand, mà bị giới hạn bởi khả năng hỗ trợ của nền tảng GPU/NIC đang dùng.

Về độ trễ: GPU-to-GPU qua InfiniBand đạt khoảng 1–2 microgiây; nếu phải giao tiếp qua CPU, độ trễ tăng lên khoảng 10–30 microgiây — cần nhớ khoảng cách chênh lệch này để xử lý các câu hỏi liên quan tới độ trễ trong đề thi.

3. NVIDIA RAPIDS và cuDF

NVIDIA RAPIDS là một framework khoa học dữ liệu, gồm tập hợp thư viện để chạy toàn bộ pipeline khoa học dữ liệu (data science pipeline) hoàn toàn trên GPU. RAPIDS gồm RAPIDS API, các thư viện RAPIDS, và nhiều dự án con — nhưng thư viện quan trọng nhất cần nhớ là cuDF.

cuDF là một thư viện dataframe GPU viết bằng Python, xây dựng trên định dạng bộ nhớ dạng cột (columnar memory format) của Apache Arrow, dùng để load, join, aggregate, filter và thao tác dữ liệu nói chung. Điểm hay của cuDF là cú pháp gần như giống hệt pandas — chuyển từ pandas sang cuDF về cơ bản chỉ cần đổi câu lệnh import và tên biến, phần còn lại gần như y hệt.

4. GPUDirect Storage

NVIDIA GPUDirect Storage cho phép một đường dẫn dữ liệu trực tiếp (direct data path) để truyền DMA (direct memory access) giữa bộ nhớ GPU và thiết bị lưu trữ, tránh phải đi qua "bounce buffer" thông qua CPU. Nếu không bật GPUDirect Storage, hệ thống có thể gặp thời gian rảnh (idle time) đáng kể trong giai đoạn nạp dữ liệu (data loading).

Dấu hiệu cần bật GPUDirect Storage: nếu CPU usage tăng vọt (spike) trong giai đoạn nạp dữ liệu — khi đó nên bật thêm RAPIDS cuDF, và có thể cần tăng số lượng data load worker process để song song hóa việc dùng CPU. Thư viện GDS cuFile cho phép ứng dụng và framework tận dụng công nghệ GDS (GPUDirect Storage) để tăng băng thông và đạt độ trễ thấp hơn.

5. NVIDIA NeMo framework

NVIDIA NeMo là một nền tảng phát triển để xây dựng các mô hình generative AI tùy chỉnh. Framework này hỗ trợ large language model, computer vision, ASR (nhận dạng giọng nói tự động), natural language processing, text-to-speech, và cho phép xây dựng, giám sát, tối ưu AI agent — nói cách khác, đây là một hệ thống quản lý vòng đời (lifecycle) đầu-cuối cho công cụ AI. Có thể hình dung NeMo tương tự các nền tảng end-to-end ML khác trên thị trường, nhưng là phiên bản của NVIDIA.

6. NVIDIA MIG — Multi-Instance GPU

NVIDIA MIG (Multi-Instance GPU) là công nghệ cho phép chia một GPU vật lý thành nhiều instance độc lập, cách ly hoàn toàn với nhau, mỗi instance hoạt động như một thiết bị GPU riêng biệt. MIG khả dụng từ thế hệ NVIDIA Ampere trở đi (compute capability 8.0), nên hỗ trợ Ampere, Hopper, và Blackwell. Số lượng instance tối đa có thể chia phụ thuộc vào từng loại phần cứng cụ thể.

Compute capability là hệ thống đánh số phiên bản của NVIDIA cho các kiến trúc GPU. Về mặt kỹ thuật, MIG phân vùng vật lý GPU thành các instance riêng biệt, mỗi instance có SM (streaming multiprocessor) riêng, lát cache L2 riêng, và bộ điều khiển bộ nhớ (memory controller) riêng. Điều cần nhớ: MIG dùng để chia một GPU vật lý thành nhiều vGPU, với giới hạn số lượng tùy theo phần cứng cụ thể đang dùng.

💡 Hình dung như thế này: Một GPU vật lý chưa chia giống một căn nhà lớn cho một gia đình duy nhất ở — mọi phòng, mọi tiện ích đều dùng chung, ai cũng có thể chiếm hết tài nguyên bất cứ lúc nào. MIG giống việc cải tạo căn nhà đó thành nhiều căn hộ độc lập, mỗi căn có phòng riêng, đường điện nước riêng (SM, cache L2, memory controller riêng) — nhiều "hộ gia đình" (workload) có thể ở cùng một tòa nhà mà không ai ảnh hưởng đến ai, dù tổng diện tích tòa nhà vẫn không đổi.

7. ONNX — định dạng model trung lập framework

ONNX (Open Neural Network Exchange) là một định dạng model mã nguồn mở, trung lập về framework (framework-agnostic), có thể export được từ hầu hết các framework ML lớn. ONNX cung cấp một "ngôn ngữ chung" mà bất kỳ framework machine learning nào cũng có thể dùng để mô tả model của mình — ví dụ chứa sẵn các hàm toán học cần thiết để một model ML (như hồi quy tuyến tính) thực hiện hàm inference của nó. Nhờ vậy, các lệnh gọi hàm được chuẩn hóa, giúp việc chuyển đổi giữa các framework khác nhau trở nên dễ dàng.

Các model được triển khai theo định dạng ONNX thường được gọi là ONNX graph — một dạng biểu diễn trực quan của model. ONNX có cả một hệ sinh thái công cụ hỗ trợ xây dựng, chuyển đổi, triển khai, tối ưu, và trực quan hóa model. Một công cụ trực quan hóa đáng chú ý là Netron — cho phép tải một model ONNX và xem toàn bộ đồ thị (graph) của nó, chạy được ngay trên trình duyệt, miễn phí, hỗ trợ nhiều định dạng model khác ngoài ONNX.

8. TensorRT và TensorRT for RTX

TensorRT là một hệ sinh thái API cho deep learning inference hiệu năng cao, tối ưu model cho phần cứng GPU của NVIDIA. TensorRT-LLM cho phép phục vụ (serve) các model LLM bằng engine TensorRT thông qua code Python — quy trình gồm chuyển đổi checkpoint model sang định dạng checkpoint của TensorRT-LLM, sau đó build engine, rồi chạy inference.

TensorRT for RTX là một thư viện inference riêng, tối ưu cho việc triển khai model AI dễ dàng trên các GPU dòng RTX — đảm bảo workload AI không "cướp" hiệu năng đồ họa (một vấn đề thực tế khi vừa chạy AI vừa dùng phần mềm khác cần đồ họa, ví dụ phần mềm ghi hình). TensorRT for RTX có thể thay thế trực tiếp (drop-in replacement) cho TensorRT trong các ứng dụng nhắm tới GPU RTX, từ thế hệ Turing tới Blackwell; có bộ tối ưu just-in-time (JIT); kích thước rất nhỏ gọn (dưới 200 MB); tối ưu các model CNN, diffusion, và speech dưới định dạng ONNX hoặc qua API C++ gốc.

Điểm khác biệt quan trọng cần phân biệt: TensorRT for RTX không hỗ trợ các nền tảng NVIDIA GPU khác như data center, edge, hay embedded — nó chỉ dành cho GPU RTX (workstation chuyên nghiệp), trong khi TensorRT (bản gốc) là thư viện dùng chung cho các nền tảng GPU khác của NVIDIA. Vì tên gọi khá giống nhau, đây là điểm dễ gây nhầm lẫn trong đề thi.

9. Lượng tử hóa model (quantization)

Quantization (lượng tử hóa) giảm dung lượng bộ nhớ và chi phí tính toán bằng cách chuyển đổi trọng số model sang độ chính xác (precision) thấp hơn — ví dụ từ BF16 xuống FP8. TensorRT-LLM có sẵn các công thức lượng tử hóa (quantization recipes) cho FP4, FP8, và nhiều định dạng khác.

Một phương pháp quantization gồm 3 phần: định dạng độ chính xác trọng số (weight precision format), định dạng độ chính xác activation (activation format), và thuật toán độ chính xác activation (activation precision algorithm). Transformer Engine của H100 được thiết kế chuyên biệt cho inference ở FP8 — ví dụ, một model LLaMA 70 tỷ tham số sẽ được lượng tử hóa về định dạng FP8 để đạt hiệu năng tối ưu khi chạy trên H100.

Ghi nhớ cốt lõi: transformer engine có thể chạy FP8 hoặc FP16, nhưng FP8 thường là lựa chọn tối ưu nhất cho hiệu năng khi chạy trên H100 — dùng TensorRT-LLM cùng kỹ thuật quantization để đưa model về độ chính xác phù hợp nhất với phần cứng.

10. NCCL nâng cao: các phép toán collective

NCCL hỗ trợ các phép toán giao tiếp tập thể (collective communication primitives) sau: all-reduce, broadcast, reduce, all-gather, reduce-scatter, all-to-all, gather, và scatter.

Trước tiên cần hiểu khái niệm rank: đây là định danh duy nhất (unique identifier) được gán cho từng tiến trình (process) tham gia vào một phép tính phân tán (distributed computation) — mỗi GPU nhận một ID riêng khi tham gia một thao tác phân tán. NCCL cho phép giao tiếp GPU-to-GPU không chỉ trong cùng máy mà còn qua mạng (Ethernet) — ví dụ giữa các rack khác nhau. Khi thực hiện một phép toán collective như all-reduce, broadcast, hay gather, mọi rank đều phải gọi cùng một phép toán với tham số khớp nhau — ví dụ rank 0, 1, 2, 3 đều phải cùng thực hiện all-reduce, cùng dùng float32.

Một ví dụ ứng dụng thực tế: all-reduce thường được dùng để tính gradient cho mạng neural trong quá trình huấn luyện phân tán.

Chi tiết từng phép toán:

Phép toánMô tả
All-reduceThực hiện một phép reduction (ví dụ sum, min, max) trên dữ liệu từ tất cả các rank, rồi lưu cùng kết quả vào tất cả các rank
ReduceThực hiện reduction tương tự, nhưng chỉ lưu kết quả vào một rank nhận (receive buffer) duy nhất
Reduce-scatterKết quả được chia (scatter) thành các khối kích thước bằng nhau giữa các rank — mỗi rank nhận một phần dữ liệu dựa theo chỉ số rank, phụ thuộc vào cách ánh xạ rank-thiết bị
BroadcastSao chép một buffer N phần tử từ rank gốc (root rank) tới tất cả các rank khác
All-gatherGom (gather) N giá trị từ K rank vào một buffer đầu ra kích thước K, kết quả được sắp xếp theo thứ tự rank — cũng bị ảnh hưởng bởi cách ánh xạ rank-thiết bị
All-to-allMỗi rank cung cấp một buffer đầu vào kích thước K×N giá trị, trong đó khối thứ n gồm N giá trị được gửi tới rank đích tương ứng; mỗi rank nhận lại một buffer đầu ra ghép từ các khối N giá trị đến từ rank nguồn tương ứng
GatherGom toàn bộ dữ liệu lại với nhau (đúng như tên gọi)
ScatterPhân tán dữ liệu ra (đúng như tên gọi), ngược lại với gather
4 Core NCCL Collective Operations (4 ranks = 4 GPUs)ALL-REDUCE (e.g. sum)2514reduce (sum)12121212Every rank receives the SAME result(2+5+1+4 = 12, copied to all 4 ranks)Most common: gradient averaging in trainingBROADCAST7root rank sends to everyone7777Copies the exact value from theroot rank to all other ranksGATHERABCDcollected into 1 rank[A, B, C, D]Each rank contributes its own data,all combined into exactly 1 receiving rankSCATTER[A, B, C, D]split evenly across 4 ranksABCDOpposite of Gather — 1 rankdistributes, each rank gets 1 partReduce-scatter and All-gather are combined variants of the operations above

Trong số các phép toán trên, một số (như reduce-scatter, all-to-all) khá phức tạp và không nhất thiết cần hiểu sâu — chỉ cần biết chúng tồn tại. Nhưng all-reduce là phép toán xuất hiện nhiều nhất trong các câu hỏi liên quan tới NCCL, nên nắm chắc all-reduce sẽ giúp trả lời tốt phần lớn câu hỏi dạng này.


Nguồn tham khảo

Nguồn gốc: NVIDIA-Certified Associate AI Infrastructure and Operations (NCA AIIO) Free Study Course — kênh freeCodeCamp.org