Tin ngành
NVIDIA tăng tốc ROS 2 với AI Agent và Isaac ROS: Đột phá truyền tải dữ liệu GPU
(giờ Việt Nam)
Tóm tắt AI
NVIDIA giới thiệu cơ chế truyền dữ liệu không sao chép (zero-copy) cho ROS 2 thông qua CUDA buffer, giúp tối ưu hiệu suất xử lý dữ liệu GPU giữa các node, đồng thời tích hợp AI Agent để nâng cao khả năng tự động hóa trong robot.
Bản dịch AI

Tăng tốc GPU có thể đẩy nhanh các khối lượng công việc robot đòi hỏi tính toán cao, nhưng chỉ một CUDA kernel nhanh thôi là chưa đủ để đảm bảo một ROS 2 graph nhanh. Khi các thông điệp (messages) di chuyển giữa các node, chúng có thể tiếp tục bị tuần tự hóa (serialized) hoặc sao chép qua bộ nhớ CPU, làm mất đi lợi ích của việc duy trì các khối lượng công việc AI và xử lý hình ảnh trên GPU (Hình 1).
Với lớp trừu tượng rosidl::Buffer ở tầng upstream và CUDA buffer backend mà NVIDIA gần đây đã đóng góp cho ROS Lyrical, các node ROS 2 có thể trao đổi dữ liệu lưu trú trên GPU thông qua cơ chế truyền tải zero-copy khi điều kiện runtime cho phép, trong khi vẫn bảo toàn các thông điệp ROS 2 tiêu chuẩn và ranh giới node. Tất cả các node trong NVIDIA Isaac ROS 5.0 đã được cập nhật để sử dụng CUDA buffer backend và hưởng lợi từ việc di chuyển dữ liệu hiệu quả hơn nhờ rosidl::Buffer.
Các node ROS 2 hiện có có thể áp dụng rosidl::Buffer với những thay đổi tối thiểu. Nhiệm vụ khó khăn hơn là xác định các ranh giới chính xác cần cập nhật. Điều này đòi hỏi phải kiểm tra kỹ lưỡng việc cấp phát bộ nhớ, tuần tự hóa, quyền sở hữu stream và hành vi dự phòng (fallback).
Hướng dẫn này sẽ đưa bạn qua quy trình chuyển đổi việc kiểm tra đó thành một luồng công việc do tác nhân (agent) điều khiển. Một AI coding agent sử dụng kỹ năng migrate-node-to-rosidl-buffer được xây dựng chuyên biệt để kiểm tra một node đã được tăng tốc bằng CUDA, theo dõi quá trình di chuyển dữ liệu, lập kế hoạch tái cấu trúc tối thiểu nhằm bảo toàn giao diện, và xác minh rằng đường dẫn truyền tải CUDA thực sự được kích hoạt. Bạn sẽ học cách sử dụng kỹ năng của agent để cập nhật node nhằm áp dụng CUDA buffer backend. Khối lượng công việc đã được tăng tốc sau đó có thể được triển khai trên NVIDIA Jetson AGX Thor.
Giới thiệu về rosidl::Buffer và CUDA buffer backend
Trong ROS 2 Lyrical, các trường mảng nguyên thủy có độ dài biến đổi như uint8[] được biểu diễn trong mã C++ được tạo ra bởi rosidl::Buffer<uint8_t>. rosidl::Buffer dựa trên CPU mặc định hoạt động giống như giao diện std::vector<uint8_t> mà mã ROS 2 hiện tại mong đợi, giúp bảo toàn tính tương thích của mã nguồn. Lớp trừu tượng có thể cắm (pluggable) này cũng cho phép các nhà cung cấp nền tảng hỗ trợ bộ lưu trữ được quản lý bên ngoài mà không cần định nghĩa một kiểu thông điệp ROS riêng biệt.
NVIDIA đã đóng góp CUDA buffer backend cho ROS 2 Lyrical. Nó triển khai bộ lưu trữ rosidl::Buffer<uint8_t> với CUDA Virtual Memory Management (VMM). Khi publisher và subscriber đáp ứng các yêu cầu runtime của backend, dữ liệu có thể di chuyển giữa các node cùng vị trí mà không cần tuần tự hóa hoặc sao chép qua host. Nếu không, ROS 2 sẽ tự động chuyển sang đường dẫn CPU tương thích với bất kỳ node ROS 2 hiện có nào. Đường dẫn tối ưu yêu cầu cùng một host, thiết bị CUDA, người dùng Linux và một triển khai RMW được hỗ trợ (ví dụ: rmw_fastrtps_cpp và rmw_zenoh_cpp).


Kết hợp lại, rosidl::Buffer và CUDA buffer backend đưa việc chia sẻ bộ nhớ và quản lý vòng đời dữ liệu vào phía sau một trường ROS 2 tiêu chuẩn. Điều này có nghĩa là khả năng upstream này dễ áp dụng hơn trong các ứng dụng robot tăng tốc bằng GPU, vì vậy bạn có thể tập trung vào logic của node trong khi vẫn duy trì khả năng dự phòng CPU cho các peer không tương thích.
Bắt đầu với node ROS 2
Hướng dẫn này sử dụng node Depth Anything 3 (DA3) TensorRT ROS 2 làm ví dụ. Mô hình DA3 dự đoán hình học nhất quán về không gian từ một số lượng đầu vào hình ảnh bất kỳ, có hoặc không có thông tin về tư thế camera (camera poses).
Chúng tôi hướng tới việc cập nhật node này để áp dụng CUDA buffer backend nhằm tận dụng hiệu suất cải thiện mà tính năng rosidl::Buffer mang lại. Node này đặc biệt hữu ích như một ví dụ về di chuyển vì thuật toán của nó đã được tăng tốc bằng GPU.
Callback của node này chuyển đổi hình ảnh ROS đầu vào thành dạng xem OpenCV, chạy suy luận độ sâu theo mét đơn nhãn (monocular metric-depth inference) với NVIDIA TensorRT, chuyển đổi cv::Mat kết quả trở lại thành hình ảnh ROS và xuất bản nó dưới dạng hình ảnh độ sâu dấu phẩy động (floating-point depth image).
Mã nguồn khá đơn giản, nhưng ranh giới ROS dựa trên CPU lại bao quanh một thuật toán thuần GPU. Ranh giới CPU đó phù hợp cho một nhà sản xuất hoặc người tiêu dùng CPU, nhưng nó là không cần thiết khi các node ở cả hai phía đã có thể tạo và tiêu thụ bộ nhớ CUDA. Trong trường hợp đó, hai lần chuyển dữ liệu host có kích thước bằng payload, việc cấp phát host và công việc tuần tự hóa trở thành một cơ hội tối ưu hóa tại giao diện.
Do đó, mục tiêu không phải là thiết kế lại mô hình hay thay thế các thông điệp tiêu chuẩn của nó; thay vào đó, là bảo toàn hợp đồng ROS hiện có trong khi cho phép trường Image.data mang bộ lưu trữ từ một backend phù hợp.
Lập kế hoạch di chuyển bằng kỹ năng của agent
Một AI coding agent rất phù hợp cho công việc điều tra: theo dõi dữ liệu qua các callback và thư viện hỗ trợ, tìm kiếm ranh giới host-device, bảo toàn hợp đồng node, và điều phối các thay đổi về mã nguồn, phụ thuộc, khởi chạy và kiểm thử.
Kỹ năng migrate-node-to-rosidl-buffer biến phân tích này thành một quy trình có thể lặp lại. Thay vì thay thế node bằng một mẫu hoặc tự động viết lại mã, nó hướng dẫn agent:
Tái cấu trúc node với rosidl::Buffer
Sử dụng kỹ năng di chuyển rosidl::Buffer, agent cập nhật các phụ thuộc và giao diện của node để áp dụng CUDA buffer backend. Hầu hết các thay đổi đều điều chỉnh TensorRT wrapper để chấp nhận các handle bộ đệm CUDA cho dữ liệu đầu vào và đầu ra trong khi vẫn bảo toàn API hiện có. Thay đổi về truyền tải ROS vẫn ở mức nhỏ: một tùy chọn đăng ký (subscription option), một lần cấp phát CUDA, hai lần trích xuất handle nhận biết stream, và một lần xuất bản. Không cần thông điệp tùy chỉnh, chủ đề CUDA trùng lặp hoặc nhánh publisher CPU/CUDA nào.
Các phần sau đây giải thích những thay đổi chính mà bạn có thể mong đợi từ kỹ năng này đối với việc di chuyển node.
Thêm các phụ thuộc CUDA buffer backend
Đầu tiên, kỹ năng này giúp thêm các gói CUDA buffer backend (cuda_buffer và cuda_buffer_backend) làm các phụ thuộc bổ sung. Định nghĩa thông điệp không thay đổi—node vẫn tiếp tục sử dụng sensor_msgs/msg/Image.
Cập nhật đăng ký hình ảnh để chấp nhận thông điệp CUDA
Subscriber sau đó được cập nhật để chấp nhận các thông điệp với bộ đệm dựa trên CUDA. CPU vẫn là phương án dự phòng chấp nhận được theo mặc định, vì vậy callback ở cấp độ node không cần các triển khai CPU và CUDA riêng biệt.
Cấu trúc image_transport và message_filters hiện có vẫn được giữ nguyên. Các tùy chọn đăng ký chỉ đơn giản là được chuyển tiếp qua đó.
Ghi trực tiếp vào bộ lưu trữ thông điệp dựa trên CUDA
Callback của subscriber vẫn chấp nhận bgr8, bảo toàn header, kích thước, mã hóa và byte stride, và chỉ chuyển đổi với cv_bridge khi một mã hóa đầu vào khác yêu cầu. Với bản cập nhật này, suy luận TensorRT hiện ghi kết quả trực tiếp vào bộ đệm CUDA được cấp phát trong thông điệp đầu ra, sẵn sàng xuất bản ngay sau khi công việc GPU được xếp hàng.
Đoạn trích sau đây chứa những thay đổi thiết yếu tận dụng các API bộ đệm CUDA:
Mỗi dòng có một mục đích cụ thể:
Giữ riêng biệt các công việc tùy chọn trên host
Kỹ năng này giữ nguyên lộ trình không phải CUDA. Việc xây dựng đám mây điểm (point-cloud) và trực quan hóa gỡ lỗi là các tác vụ tiêu thụ CPU cục bộ trong node gốc. Khi được kích hoạt, chúng vẫn có thể yêu cầu sao chép từ thiết bị sang host và đồng bộ hóa. Chúng không quyết định cách biểu diễn được phân phối trên chủ đề độ sâu, vì vậy quá trình di chuyển để chúng là các ranh giới tùy chọn rõ ràng thay vì làm phức tạp đường dẫn xuất bản đã tối ưu hóa.
Xây dựng và chạy pipeline ROS 2 tăng tốc bằng GPU
Tính năng rosidl::Buffer được giới thiệu trong ROS 2 Lyrical, vì vậy node đã di chuyển dự kiến sẽ hoạt động với Lyrical trở lên cùng các triển khai RMW được hỗ trợ (rmw_fastrtps_cpp và rmw_zenoh_cpp).
Trong quá trình di chuyển, các hàm cốt lõi và kiểu thông điệp ranh giới được giữ nguyên và thêm cuda_buffer và cuda_buffer_backend làm các phụ thuộc bổ sung vào gói để kích hoạt CUDA buffer backend. Kết quả là, quy trình xây dựng và thiết lập tổng thể vẫn tương tự như node gốc.
Để kích hoạt CUDA buffer backend, hãy xây dựng các gói từ mã nguồn. Bắt đầu bằng cách clone mã nguồn từ kho lưu trữ rosidl_buffer_backends nơi lưu trữ tất cả các backend hiện được hỗ trợ và các gói đi kèm:
Lưu ý rằng các hàm cốt lõi của rosidl::Buffer đã được tích hợp sẵn trong ROS 2 Lyrical, vì vậy không cần phải xây dựng lại các gói cốt lõi của ROS 2.
Các backend của rosidl::Buffer được thiết kế dưới dạng các plugin ROS 2. Việc xây dựng và nạp (source) các gói CUDA buffer backend trong cùng một workspace là đủ để làm cho backend khả dụng với các node tại thời điểm runtime.
Bài viết được AI dịch và tổng hợp tự động từ NVIDIA Technical Blog: Agentic AI / Generative AI. Liên kết bài gốc ở phía trên. AIHOT.vn luôn dẫn nguồn đầy đủ — nếu bạn thấy điểm cần chỉnh sửa, hãy gửi ý kiến tại trang phản hồi.