NVIDIA bổ sung hỗ trợ Python native cho CUDA
(thenewstack.io)- CUDA đang mở rộng ra khỏi hệ sinh thái vốn xoay quanh C/C++, theo hướng cho phép lập trình viên Python xử lý điện toán GPU NVIDIA trực tiếp hơn
- Hỗ trợ mới không chỉ là binding đơn thuần, mà là nỗ lực tích hợp giao diện Python và luồng scripting vào toàn bộ bộ công cụ CUDA
- CUDA Python stack bao gồm binding cơ bản, trình biên dịch runtime, cuPyNumeric, CUDA Core, NVMath Python, profiler và các công cụ phân tích mã
- NVIDIA muốn tận dụng biên dịch JIT và kết nối với mã C++ hiện có để tăng năng suất của Python trong khi giữ chênh lệch hiệu năng ở mức nhỏ
- Giao diện CuTile là mô hình giúp lập trình viên Python hiểu và gỡ lỗi tác vụ GPU theo đơn vị mảng và tile thay vì thread
Python native đã vào CUDA
- Theo khảo sát mã nguồn mở năm 2024 của GitHub, Python đã vượt JavaScript để trở thành ngôn ngữ lập trình phổ biến nhất thế giới
- Bộ công cụ phần mềm CUDA của NVIDIA trong nhiều năm không có hỗ trợ Python native, nhưng tại GTC, hãng đã công bố hỗ trợ native và tích hợp đầy đủ
- Lập trình viên có thể trực tiếp viết các tác vụ tính toán dạng thuật toán chạy trên GPU NVIDIA bằng Python
- Kiến trúc sư CUDA Stephen Jones cho biết ông đã làm việc để đưa “accelerated Python” vào CUDA stack như một hỗ trợ hạng nhất
- Hướng đi mới không phải là chuyển C sang cú pháp Python, mà là tạo ra CUDA Python tự nhiên với lập trình viên Python
Mở rộng tới cộng đồng lập trình viên Python
- Trước đây CUDA đòi hỏi kiến thức C++ hoặc Fortran; tuy có một số công cụ Python, nhưng đó chưa phải hỗ trợ native
- Hỗ trợ Python native mở các công cụ phát triển CUDA cho hàng triệu lập trình viên Python
- Theo The Futurum Group, số người dùng CUDA đã tăng từ 2 triệu vào năm 2020 lên 4 triệu vào năm 2023
- Python là ngôn ngữ tăng trưởng nhanh, và NVIDIA giờ có thể tiếp cận cả lập trình viên Python ở các nước đang phát triển như Ấn Độ và Brazil
- Phần lớn GPU NVIDIA nằm ở Mỹ và châu Âu, nhưng các công ty viễn thông và hạ tầng của Ấn Độ đang xây dựng những cụm GPU quy mô lớn sẽ được vận hành trong tương lai
- NVIDIA đang nỗ lực thu hút lập trình viên và muốn hỗ trợ thêm nhiều ngôn ngữ lập trình, bao gồm Rust và Julia
Cấu thành Pythonic CUDA stack
- CUDA bao gồm thư viện, SDK, trình biên dịch, host runtime, công cụ, phần mềm và thuật toán đóng gói sẵn
- NVIDIA đã bổ sung các thành phần trên toàn bộ Pythonic CUDA stack
- Mục tiêu cốt lõi là cung cấp tăng tốc GPU mà không cần rời khỏi Python
- Theo Jones, CUDA Python không nên chỉ dừng ở việc cung cấp kernel; cần có luồng thực thi liền mạch với toàn bộ stack
- Cần có khả năng viết kernel rồi đưa vào PyTorch
- Cũng cần gọi được các thư viện Pythonic và các thành phần khác
- Lớp trình biên dịch về thực chất được xây quanh biên dịch JIT, giúp giảm mạnh cây phụ thuộc của GPU stack
- Khả năng tương tác giữa các lớp rất quan trọng để tăng năng suất khi dùng Python end-to-end
CUDA Core, cuPyNumeric, NVMath Python
- Ban đầu NVIDIA xây dựng các binding Python cơ bản và thư viện Python, bao gồm trình biên dịch runtime
- cuPyNumeric là một lựa chọn thay thế drop-in cho NumPy, thư viện tính toán được dùng rộng rãi trong Python
- Chỉ cần thay một lệnh import, mã NumPy sẽ chạy trên GPU thay vì CPU
- Trong năm qua, NVIDIA đã tạo ra CUDA Core, và Jones xem đây là kết quả của việc hình dung lại CUDA runtime theo cách Python tự nhiên và native
- CUDA Core đi theo luồng thực thi của Python, hoạt động hoàn toàn trong cùng tiến trình và phụ thuộc nhiều vào biên dịch JIT
- NVIDIA cũng tạo ra NVMath Python, cung cấp giao diện thống nhất cho các lời gọi thư viện phía host và phía device
- Theo Jones, khả năng hợp nhất các lời gọi thư viện có thể mang lại cải thiện hiệu năng lớn
- Các thư viện cho phép truy cập trực tiếp các thư viện C++ đã được tăng tốc từ mã Python cũng đã được xây dựng
- Không triển khai lại bằng Python, mà kết nối với mã C++ đã được tinh chỉnh kỹ lưỡng từ trước
- Jones cho rằng với cách này, chênh lệch hiệu năng trở nên không đáng kể
- Công cụ cho profiler và trình phân tích mã cũng được bổ sung
Mô hình lập trình CuTile
- Python giúp lập trình dễ hơn mà không cần quá bận tâm đến chi tiết phần cứng, và NVIDIA đang bổ sung lớp lập trình phù hợp với mức trừu tượng cao hơn cho việc thực thi trên GPU
- Mô hình lập trình mới, giao diện CuTile, trước hết được phát triển cho Pythonic CUDA, sau đó sẽ có phần mở rộng C++ CUDA
- CuTile được thiết kế dựa trên thực tế rằng lập trình viên Python, cũng như lập trình viên C++, thường suy nghĩ xoay quanh mảng hơn là thread
- Không thể “thần kỳ” xuất mã Python sang dạng tăng tốc GPU
- CUDA thường chia bài toán thành hàng nghìn block nhỏ
- Block được chia thành các tile nhỏ hơn
- Bên trong tile, hàng nghìn thread xử lý từng phần tử đơn lẻ
- Các thread kết hợp lại để thực hiện một phép toán
- Năng lực tính toán lớn của GPU đến từ khả năng xử lý song song ở cấp thread cho tới từng phần tử đơn lẻ
- NVIDIA cho rằng thực thi GPU không nhất thiết phải hạ xuống tận cấp thread, mà cũng có thể xử lý ở bước trung gian là cấp tile
- CuTile ánh xạ mảng lên GPU một cách hiệu quả ở mức ít chi tiết hơn, giúp việc hiểu mã và gỡ lỗi dễ hơn
- Theo Jones, cách tiếp cận này về cơ bản dẫn đến cùng mức hiệu năng
- Dữ liệu của tile có thể gồm vector, tensor và mảng
- Trình biên dịch có thể ánh xạ toàn bộ phép toán trên mảng từ thread block sang GPU tốt hơn; Jones cho rằng vì trình biên dịch hiểu sâu chi tiết thực thi GPU nên nhiều khi nó làm tốt hơn ông
- Khác với C++, Python về mặt thiết kế không phải là ngôn ngữ chi tiết ở mức thấp, và Jones nêu OpenAI Triton như một ví dụ phù hợp tự nhiên với chương trình Python
2 bình luận
Liệu nó có nhanh hơn các wrapper CUDA hiện có như CuPy hay PyTorch không nhỉ. Ưu điểm của CuPy và torch là API gần như giống hệt NumPy, nên có thể chuyển các đoạn mã kiểm thử đã viết bằng NumPy sang mà không tốn nhiều công sức; cái này thì chắc phải dùng thử mới biết thế nào.
Tốc độ ban đầu này có thật không? Chậm quá...