Thiết kế các Query Engine được tăng tốc bằng GPU với NVIDIA GQE

 

Các công cụ truy vấn tăng tốc bằng GPU (GPU-accelerated Query Engine) thường bị hạn chế bởi bộ nhớ và băng thông I/O. Những tiến bộ phần cứng của NVIDIA—bao gồm bộ nhớ băng thông cao (HBM), NVIDIA NVLink-C2C và các công cụ giải nén chuyên dụng có trong NVIDIA GB200 NVL4 —giúp loại bỏ những nút thắt cổ chai này bằng cách tăng dung lượng lưu trữ hiệu quả, tăng tốc độ di chuyển dữ liệu giữa CPU và GPU, và tăng tốc độ truy cập dữ liệu mà không tiêu tốn tài nguyên bộ xử lý đa luồng (SM).

Trong bài viết này, chúng tôi sẽ trình bày cách các cơ sở dữ liệu có thể sử dụng các công nghệ này để tăng tốc quá trình thực thi truy vấn GPU. Bạn sẽ tìm hiểu các kỹ thuật di chuyển dữ liệu hiệu quả giữa CPU và GPU, nén dữ liệu, cắt tỉa phân vùng và truyền dữ liệu chồng chéo với tính toán.

Tổng quan về kiến ​​trúc của GQE

GQE (GPU Query Engine) là một kiến ​​trúc tham chiếu được thiết kế để thực thi các truy vấn SQL với hiệu suất cao trên các tập dữ liệu lớn trên phần cứng NVIDIA hiện đại. Về mặt kỹ thuật, GQE sử dụng NVIDIA cuDF và các thư viện NVIDIA CUDA-X khác, bao gồm CCCL , nvCOMP và nvSHMEM .

GQE có thể giúp tác động đến các công cụ tìm kiếm để:

  • Chuyển việc thực thi sang GPU.
  • Chuyển quá trình giải nén sang nvCOMP.
  • Đảm bảo định dạng dữ liệu tương thích với GPU.
  • Thu hẹp khoảng cách hiệu năng tổng thể khi chạy trên GPU.

Hình 1. Một truy vấn SQL trải qua ba lớp kiến ​​trúc của GQE—truy vấn, dữ liệu và thực thi—để được tăng tốc bằng GPU.

Hình 1 trình bày tổng quan về thiết kế hệ thống bằng cách chia GQE thành các lớp truy vấn, dữ liệu và thực thi. Các lớp này quản lý quá trình chuyển đổi từ truy vấn SQL và dữ liệu đầu vào sang thực thi ở cấp độ phần cứng. Các lớp được kết hợp với nhau như sau.

Lớp truy vấn bổ sung cho công cụ thực thi bằng một trình phân tích cú pháp SQL và một trình tối ưu hóa truy vấn. Lớp truy vấn chấp nhận trực tiếp các kế hoạch Substrait, một định dạng kế hoạch truy vấn mã nguồn mở, để thực thi trong GQE. Substrait cho phép đánh giá lợi ích của việc thực thi GPU bằng cách xuất các kế hoạch truy vấn từ một sản phẩm cơ sở dữ liệu hiện có và chạy kế hoạch đó trong GQE. Trong Hình 2, Apache DataFusion chuyển đổi một chuỗi SQL thành một kế hoạch Substrait. GQE sử dụng kế hoạch đó như một kế hoạch truy vấn logic được tối ưu hóa, thêm các tinh chỉnh dành riêng cho GQE và chuyển đổi truy vấn thành một kế hoạch vật lý.

Lớp dữ liệu lưu trữ và sắp xếp dữ liệu người dùng để trình thực thi có thể truy cập nhanh chóng. Trong GQE, việc lưu trữ được trừu tượng hóa thành các trình đọc chuyên dụng có thể cắm thêm, xử lý các định dạng dữ liệu và phương tiện lưu trữ khác nhau — hiện tại nó hỗ trợ bộ nhớ GPU, bộ nhớ CPU và ổ đĩa. Trong bài viết này, chúng ta tập trung vào định dạng bảng trong bộ nhớ hiệu năng cao của GQE và giả định dữ liệu này được lưu trữ trong bộ nhớ CPU. GQE chuyển các khối dữ liệu đến GPU theo yêu cầu để tận dụng tối đa GPU mà không cần lưu trữ toàn bộ tập dữ liệu trong bộ nhớ GPU. Khi một khối dữ liệu đến GPU, lớp dữ liệu sẽ chuyển giao cho lớp thực thi.

Lớp thực thi sẽ thực hiện kế hoạch truy vấn vật lý đối với dữ liệu để tạo ra kết quả truy vấn. GQE tạo ra kế hoạch vật lý thành một đồ thị tác vụ, định nghĩa lịch trình thực thi. Đồ thị tác vụ chứa các toán tử quan hệ được xây dựng trên thư viện mã nguồn mở NVIDIA cuDF , thư viện này triển khai các toán tử bằng mã CUDA C++ được tối ưu hóa cao. Vì lớp dữ liệu truyền tải theo từng khối, GQE có thể phân tách các toán tử và thực thi các tác vụ trên các khối đó đồng thời dưới dạng các luồng CUDA được xử lý theo đường ống.

Tóm lại, GQE khai thác tối đa hiệu năng cao của phần cứng thông qua thiết kế dựa trên GPU.

Bố cục dữ liệu và điều phối quá trình truyền tải

Lớp dữ liệu GQE được tối ưu hóa để truyền dữ liệu hiệu quả từ bộ nhớ máy chủ sang bộ nhớ thiết bị. Chúng tôi giảm thiểu độ trễ truyền dữ liệu bằng cách tối đa hóa thông lượng và giảm lượng dữ liệu được di chuyển. Sau đây, chúng tôi sẽ trình bày tổng quan về bố cục dữ liệu trong bộ nhớ và quá trình điều phối truyền dữ liệu từ máy chủ sang thiết bị, những yếu tố quan trọng để giảm thiểu độ trễ truyền dữ liệu.

Mục tiêu thiết kế của GQE 

Vì GQE được xây dựng trên cuDF, thiết kế giả định rằng dữ liệu trong GPU được cấu trúc dưới dạng các bảng gốc của cuDF. Tuy nhiên, bố cục bộ nhớ của máy chủ có thể tối ưu hóa việc truyền dữ liệu cho NVIDIA NVLink C2C và PCIe. cudaMemcpy là phương pháp truyền dữ liệu tiêu chuẩn. Trong phương pháp này, CPU điều phối việc thực thi GPU và sao chép dữ liệu trong một lần truyền tải hàng loạt. Điều này cũng tạo cơ sở cho việc truyền tải dữ liệu nén.

Bố cục dữ liệu

Hình 2. Định dạng bảng trong bộ nhớ của GQE tổ chức dữ liệu dạng cột thành các nhóm hàng và phân vùng để truyền tải hiệu quả đến GPU.

Hình 2 thể hiện bố cục dữ liệu bảng, được chia theo chiều ngang thành các nhóm hàng. Mỗi nhóm hàng bao gồm các cột và chứa siêu dữ liệu. Trong một nhóm hàng, GQE lưu trữ các cột dưới dạng các phân vùng không liền kề. Trong quá trình truyền tải, lớp lưu trữ chuyển đổi một tập hợp các phân vùng thành một cột cuDF. Do đó, lớp dữ liệu che giấu các chi tiết triển khai của quá trình nén và cắt tỉa phân vùng khỏi lớp thực thi.

Điều phối chuyển giao

Hình 3. Song song hóa đường ống chồng chéo việc lập lịch, truyền dữ liệu, giải nén và thực thi GPU trên các nhóm hàng để tăng tốc độ truyền dữ liệu.

Hình 3 minh họa cách CPU điều phối quá trình truyền dữ liệu. Theo các nguyên tắc thực hành tốt nhất của CUDA, quá trình truyền dữ liệu sử dụng song song đường ống để tận dụng hiệu quả các thành phần phần cứng. Một quá trình truyền dữ liệu theo đường ống bao gồm nhiều giai đoạn. Trong dữ liệu được nén và phân vùng, có bốn giai đoạn.

  • Ở Giai đoạn 0, một luồng máy chủ thực hiện việc lập lịch. Việc lập lịch bao gồm tính toán phạm vi bộ nhớ cần truyền, phân bổ bộ đệm đích và gọi các phương thức CUDA cần thiết.
  • Ở giai đoạn 1, GPU thực hiện quá trình truyền tải H2D.
  • Giai đoạn 2 giải nén dữ liệu.
  • Giai đoạn 3, được thêm vào bên ngoài lớp dữ liệu, trong đó các nhân CUDA tính toán truy vấn.

Bốn giai đoạn này nên chồng chéo lên nhau. Lý tưởng nhất là thời gian thực thi truy vấn bằng với giai đoạn chạy lâu nhất, và tất cả các giai đoạn còn lại được ẩn đi bởi quy trình xử lý dữ liệu.

Tối ưu hóa truyền dữ liệu

Tốc độ truy cập dữ liệu nhanh đóng vai trò quan trọng trong lợi thế hiệu năng mà GQE đạt được. Các tối ưu hóa truy cập dữ liệu chính được sử dụng là nén và cắt tỉa phân vùng. Sau đây, chúng tôi mô tả cách thức hoạt động của các tối ưu hóa này.

Nén

GQE nhận được hai lợi ích chính từ việc nén dữ liệu: dung lượng tập dữ liệu truy vấn và khả năng tăng tốc truy vấn. Việc nén cho phép công cụ truy vấn mở rộng kích thước tập dữ liệu có thể được xử lý bằng cách sử dụng một lượng bộ nhớ nhất định, từ đó giảm tổng dung lượng bộ nhớ cần thiết. Việc truyền dữ liệu của các bộ đệm đã nén, kết hợp với việc giải nén nhanh chóng bởi GPU, giúp tăng tốc độ truyền tải ngay cả trên các kết nối tốc độ cao như NVLink C2C. GQE nén các tập dữ liệu bằng các định dạng được tối ưu hóa cho GPU, giúp cải thiện tỷ lệ nén và cung cấp tốc độ giải nén GPU vượt trội so với việc sử dụng các định dạng cũ.

Thư viện NVIDIA nvCOMP 

NVIDIA nvCOMP là một thư viện dùng để nén và giải nén dữ liệu bằng GPU. Nó cung cấp một loạt các định dạng nén tiêu chuẩn và được tối ưu hóa cho GPU. Người dùng có thể chọn từ các thuật toán được hỗ trợ để cân bằng tỷ lệ nén, hiệu suất nén và giải nén. nvCOMP có thể tích hợp các thư viện CPU như lz4hc vào giao diện cấp cao của nó, cung cấp thêm các tùy chọn cấu hình. GQE sử dụng nvCOMP cho các thuật toán nén và giải nén của mình.

Công cụ giải nén NVIDIA Blackwell

NVIDIA đã giới thiệu một công cụ giải nén (Decompression Engine – DE) mới trong kiến ​​trúc NVIDIA Blackwell , cho phép nvCOMP giải nén nhanh các định dạng dựa trên LZ77 như LZ4, Snappy và Deflate mà không cần sử dụng tài nguyên SM. Quá trình giải nén với DE, các nhân SM và các bản sao CE có thể chồng chéo hoàn toàn khi sử dụng nhiều luồng CUDA.

DE trên một GPU NVIDIA Blackwell B200 duy nhất có thể đạt tốc độ lên đến 400 GB/giây trong các ứng dụng cơ sở dữ liệu. Ví dụ, ở tỷ lệ nén 4x, nó đạt được thông lượng hiệu quả từ máy chủ đến thiết bị khoảng 400 GB/giây trong khi vẫn còn 100 GB/giây băng thông từ máy chủ đến thiết bị (C2C). Băng thông còn lại có thể được tận dụng để truyền tải các dữ liệu khác, bao gồm cả dữ liệu được mã hóa và giải nén trên các SM.

Phương pháp nén của NVIDIA GQE  

Hình 4 minh họa phương pháp nén lai, sử dụng các thuật toán nhẹ, chẳng hạn như Cascaded , để tận dụng các mẫu cụ thể trong dữ liệu có cấu trúc khi có thể, và DE khi cần các thuật toán dựa trên LZ để đạt được tỷ lệ nén tốt.

Hình 4. Chuỗi định dạng xếp tầng nvCOMP sử dụng mã hóa delta, mã hóa độ dài chuỗi và đóng gói bit để nén dữ liệu dạng cột một cách hiệu quả.

Khi xem xét cách nén một cột cụ thể, công cụ truy vấn có một vài lựa chọn. Nó có thể yêu cầu người dùng chỉ định thuật toán cho từng cột, nhưng điều này rất khó quản lý đối với các cơ sở dữ liệu rất lớn. Cách tiếp cận mà chúng tôi đã thực hiện là thử cả LZ4 và Cascaded. LZ4 là lựa chọn của chúng tôi cho dữ liệu thông thường vì nó đạt được tỷ lệ nén cao so với các thuật toán nén chỉ sử dụng LZ77 khác và được hỗ trợ bởi Công cụ Giải nén.

Để xác định thuật toán nén cần sử dụng, chúng tôi nén dữ liệu bằng cả hai thuật toán LZ4 và Cascaded. Thuật toán Cascaded có thể đạt tốc độ nén cực nhanh, khoảng 500 GB/giây trên B200. Điều này cho phép chúng tôi thử nghiệm thêm một thuật toán khác mà không gây ra gánh nặng đáng kể trong giai đoạn tải dữ liệu.

Chúng tôi cân bằng giữa việc sử dụng Cascaded và LZ4 bằng cách sử dụng hai thuật toán:

  1. Cascaded và LZ4 có ngưỡng tỷ lệ nén khác nhau, thiết lập mức tối thiểu để chúng ta sử dụng thuật toán đó.
  2. Để được chọn thay thế LZ4, Cascaded phải đạt tỷ lệ nén cao hơn LZ4. Ngưỡng kích hoạt là một bội số có thể cấu hình được của tỷ lệ nén LZ4.

Chúng tôi sử dụng thuật toán được lựa chọn để giúp cân bằng băng thông C2C, tài nguyên DE và SM.

Cắt tỉa phân vùng

Trước khi chuyển dữ liệu từ CPU sang GPU, GQE sử dụng cơ chế lọc bỏ các phân vùng không đóng góp vào kết quả truy vấn. Cơ chế này dựa trên siêu dữ liệu tóm tắt nội dung bảng và các điều kiện được định nghĩa trong truy vấn SQL.

Metadata và lưu trữ

GQE sử dụng bản đồ vùng để hỗ trợ việc cắt tỉa bộ lọc. Khi dữ liệu được tải dưới dạng bảng trong bộ nhớ, GQE chia bảng theo chiều ngang thành các nhóm hàng và các phân vùng có kích thước cố định với mặc định là 10 triệu hàng. Đối với mỗi phân vùng, GQE tính toán giá trị tối thiểu và tối đa cho mỗi cột và lưu trữ siêu dữ liệu này dưới dạng bảng cuDF trong bộ nhớ GPU, do đó việc cắt tỉa có thể chạy mà không trở thành nút thắt cổ chai. Việc tính toán bản đồ vùng làm tăng thêm khoảng 1% thời gian tải Parquet ban đầu và chỉ diễn ra một lần, không phải trong quá trình thực thi truy vấn.

Cắt tỉa (prunning) và điều phối tác vụ

Hình 5. Quá trình lọc bỏ dữ liệu không cần thiết đánh giá các điều kiện truy vấn dựa trên bản đồ vùng cấp phân vùng để bỏ qua dữ liệu không liên quan trước khi truyền, giảm thiểu việc di chuyển dữ liệu đến GPU.

Hình 5 minh họa quy trình cắt tỉa bộ lọc. Trong quá trình xây dựng đồ thị tác vụ, GQE tạo ra biểu thức cắt tỉa bằng cách chuyển đổi các vị từ truy vấn thành các phép so sánh với bản đồ vùng của các nhóm hàng. Các phân vùng không thể đóng góp vào kết quả truy vấn sẽ bị cắt tỉa. Trong ví dụ này, phân vùng 1 bị cắt tỉa vì bản đồ vùng cho thấy tất cả các giá trị được lưu trữ trong phân vùng này đều nhỏ hơn 9, và do đó cũng nhỏ hơn 15, giới hạn dưới. Các phân vùng còn lại được chuyển đến bộ nhớ GPU và được giải nén nếu cần. Ngay cả khi các phân vùng không liền kề trong bộ nhớ CPU sau khi cắt tỉa, ví dụ, vì chúng nằm trong nhiều nhóm hàng, chúng vẫn được chuyển và tập hợp thành một khối bộ nhớ liền kề được đóng gói dưới dạng bảng cuDF trên GPU.

Tính năng lọc bỏ dữ liệu không cần thiết (filter pruning) trong GQE rất hiệu quả. Trong bài kiểm tra hiệu năng TPC-H sử dụng tập dữ liệu quy mô 1 TB, tính năng lọc bỏ dữ liệu không cần thiết đã bỏ qua 31% dữ liệu trên tất cả 22 truy vấn. Kết quả là tốc độ xử lý tổng thể tăng lên 1,43 lần.

Việc đánh giá bản đồ vùng chỉ làm tăng thêm một lượng chi phí tối thiểu, trung bình là 2,2 ms đối với các truy vấn chuẩn trên 1 TB dữ liệu.

Tối ưu hóa truyền dữ liệu

Trong GQE, chúng tôi đề xuất một phương pháp tối ưu hóa truyền tải theo lô mới cho các phân vùng.

Nhiều phân vùng được chuyển đến GPU trong một lô duy nhất bằng cách sử dụng cudaMemcpyBatchAsync, giảm chi phí cho các phân vùng nhỏ. Việc gom nhóm cũng giúp tránh sự chậm trễ do các luồng CUDA xen kẽ. Khi các phân vùng được chuyển riêng lẻ, việc chuyển từ các luồng khác có thể làm chậm quá trình khởi chạy kernel tiếp theo. Di chuyển các phân vùng trong cùng một lô sẽ tránh được sự chậm trễ này.

Điểm nổi bật của màn trình diễn

Để đánh giá các tính năng của GPU B200 đã thảo luận ở trên trong một hệ thống Grace Blackwell hoàn chỉnh, chúng tôi đã đo hiệu năng GQE trên TPC-H ở hệ số mở rộng 1000 (1TB) bằng cách sử dụng một trong hai GPU B200 trong máy chủ NVIDIA GB200 NVL4, trong đó các GPU B200 được kết nối với CPU Grace bằng NVLink-C2C. Chúng tôi đã sử dụng DuckDB 1.4.1 trên CPU Turin Epyc 9755 làm cơ sở so sánh. Mỗi truy vấn được tính trung bình trên 5 lần chạy bộ nhớ đệm nóng, với tính năng nén và cắt tỉa được bật ở cả hai phía. Chúng tôi điều chỉnh các tham số GQE cho mỗi truy vấn, bao gồm mức độ song song và lập kế hoạch toán tử vật lý.

Bộ dữ liệu TPC-H được tối ưu hóa cho việc cắt tỉa phân vùng và nén bằng cách phân cụm bảng lineitem theo l_shipdate và bảng orders theo o_orderdate, đồng thời phân vùng cả hai bảng theo tháng. Bên trong, mỗi phân vùng được sắp xếp theo l_orderkey và o_orderkey tương ứng.

Hình 6 minh họa thời gian chạy của 22 truy vấn. GQE vượt trội hơn DuckDB ở 20 trong số 22 truy vấn, với mức cải thiện lớn nhất ở Q11, Q14 và Q15, nơi việc cắt tỉa phân vùng và nén dữ liệu giúp giảm đáng kể lượng dữ liệu truyền qua NVLink C2C. GQE cho thấy ngay cả những truy vấn tiêu tốn nhiều băng thông như Q1 và Q6 cũng được thực thi nhanh chóng trên GPU nhờ những tối ưu hóa này. Tóm lại, GQE chạy tất cả các truy vấn trong 9,0 giây, so với 74,0 giây và 70,6 giây của DuckDB trong cấu hình đơn và kép tương ứng.

Hình 6. Kết quả thử nghiệm của NVIDIA, GQE trên một GPU GB200 duy nhất cho hiệu suất vượt trội hơn DuckDB trên CPU AMD Turin hai socket trong hơn 90% số truy vấn dựa trên TPC-H ở hệ số mở rộng 1 TB.

Hình 7. GQE mang lại tốc độ tăng tổng thể gấp 7,5 lần so với cấu hình CPU tốt nhất, với mức tăng hiệu suất trên mỗi truy vấn dao động từ gần tương đương đến hơn 25 lần.

Chúng tôi trình bày tốc độ cải thiện trong Hình 7. GQE mang lại hiệu suất cao hơn tới 25,5 lần so với cấu hình socket CPU tốt nhất của DuckDB, vượt trội hơn trên 20 trong số 22 truy vấn và đạt hiệu suất gấp 3 lần trở lên trên 17 truy vấn. Tính tổng trên tất cả các truy vấn, GQE trên GB200 đạt được tốc độ tăng 7,5 lần về tổng thời gian thực thi.

Kết quả thử nghiệm trong bài đăng trên blog này được lấy từ bộ dữ liệu chuẩn hỗ trợ ra quyết định TPC-H và không thể so sánh với các kết quả TPC-H đã được công bố, vì kết quả thử nghiệm trong blog này không tuân thủ tiêu chuẩn TPC-H.

Áp dụng các phương pháp thực hành tốt nhất của GQE vào nền tảng dữ liệu.

Các công cụ cơ sở dữ liệu có thể chuyển đổi các tính năng phần cứng NVIDIA Grace Blackwell thành những cải thiện hiệu suất truy vấn có thể đo lường được thông qua các tối ưu hóa mục tiêu. Trong GQE, việc cắt tỉa phân vùng và nén lai giúp giảm thiểu khối lượng truyền tải trong khi phần cứng NVLink-C2C và DE tăng thông lượng truyền tải. Những tối ưu hóa này giúp giảm thời gian truyền tải và kết hợp thành việc thực thi truy vấn phức tạp bằng cách sử dụng NVIDIA cuDF , NVIDIA nvCOMP và các thư viện CUDA-X khác.

Trên TPC-H SF1000, GQE đã đạt được tốc độ thực thi tổng thể nhanh hơn 7,5 lần so với cơ sở dữ liệu CPU hiện đại, cho thấy cách bố cục dữ liệu, chiến lược nén và thực thi có thể được thiết kế đồng bộ cho các công cụ cơ sở dữ liệu hiện đại.

Hãy tận dụng kiến ​​trúc và thiết kế tham chiếu mã nguồn mở của GQE , cùng các tối ưu hóa hiệu năng, và khám phá cách GQE có thể tăng tốc nền tảng dữ liệu của bạn.

____
Bài viết liên quan
    TAG: