1 điểm bởi rextio 7 giờ trước | Chưa có bình luận nào. | Chia sẻ qua WhatsApp

Python có ưu điểm là được dùng nhiều trong AI, phân tích dữ liệu… và cho phép viết mã nhanh, nhưng vấn đề chậm cố hữu của ngôn ngữ thông dịch đôi khi cũng gây đau đầu trong thực tế.

Trong thực tế, để cải thiện vấn đề tốc độ của Python, người ta cân nhắc nhiều phương án khác nhau. Cũng có trường hợp mã Python chỉ được dùng cho prototype ban đầu, rồi khi chuyển sang production thì phát triển lại bằng Rust hoặc C/C++.

Tôi đang thử nghiệm phát triển một công cụ tên Rextio như một phương án mới để giải quyết vấn đề tốc độ mà không phải từ bỏ Python.

Ý tưởng cơ bản là tự động chuyển đổi những phần trong mã Python có thể chuyển sang native (như mã tĩnh có type hint) thành mã Rust rồi biên dịch thành binary để tăng hiệu năng; còn những phần khó tự động chuyển sang native (như mã động) thì giữ nguyên dưới dạng mã Python (fallback) và cho chạy bằng CPython, nhằm bảo toàn logic của mã Python gốc.

Đại khái như sau.

Dự án Python đã khai báo kiểu
-> phân tích các ứng viên native được hỗ trợ
-> từ chối các hàm không an toàn hoặc chưa được hỗ trợ
-> các hàm được chấp nhận sẽ sinh Rust + PyO3
-> phần còn lại sinh Python fallback wrapper
-> build artifact tương thích import

Vui lòng tham khảo tài liệu trong Git repository ở liên kết để biết thêm chi tiết.

Khi so sánh giữa việc chạy kèm native binary được chuyển đổi bằng Rextio và việc chạy mã Python gốc bằng CPython, cũng có thể thấy mức cải thiện hiệu năng.

  • Khi chuyển mã Python cơ bản sang native và chạy: 57.73×
  • Khi chuyển NumPy sang native và chạy: 2.52×
  • Khi chuyển NetworkX sang native và chạy thuật toán Dijkstra: 3.68×
  • Khi chuyển Series.map của pandas sang native và chạy: 66.14×
  • Khi chuyển PyTorch deep MLP sang native và chạy: 1.02× (do các package Python hiện có dùng C extension…, nên mức tăng tốc bị hạn chế)
  • Khi chuyển TensorFlow eager chain sang native và chạy: 1.04× (do các package Python hiện có dùng C extension…, nên mức tăng tốc bị hạn chế)

Vui lòng tham khảo rextio-benchmark Git repository để xem mã nguồn và thông tin môi trường chạy được dùng trong benchmark cho ra các kết quả trên.

Tham khảo thêm: Rextio có Core CLI để chuyển đổi mã Python và thực hiện biên dịch; tôi cũng đang phát triển để có thể tạo và gắn thêm các plugin bổ sung định nghĩa quy tắc chuyển đổi từng package Python sang mã Rust. Hiện đã có một số plugin như NumPy (rextio-numpy, rextio-networkx, rextio-pandas, rextio-torch, rextio-tensorflow, v.v.), và các kết quả benchmark ở trên được chạy bằng cách sử dụng các plugin này.

Tất nhiên Rextio vẫn là một dự án giai đoạn đầu còn nhiều điểm cần cải thiện, và không phải trong mọi tình huống việc biên dịch mã Python sang native dựa trên Rust cũng mang lại cải thiện hiệu năng.

Ví dụ, nếu việc trao đổi dữ liệu giữa phần native và phần CPython fallback diễn ra thường xuyên, dữ liệu phải được chuyển đổi và đi qua ranh giới, nên thậm chí có thể gây chậm hơn. Tuy nhiên trong Rextio, với những trường hợp như vậy, công cụ đang được định hướng để fallback toàn bộ phần đó sang CPython, không đi qua native, nhằm tránh giảm tốc độ.

Tôi đã phát triển một mình trong thời gian qua và thấy dự án đã phần nào ổn định, nên xin giới thiệu tại đây.

Nếu có câu hỏi, ý kiến hay phản hồi, tôi sẽ cố gắng trả lời và tiếp thu nhiều nhất có thể.

Xin cảm ơn.

Chưa có bình luận nào.

Chưa có bình luận nào.