3 điểm bởi GN⁺ 2024-07-13 | 1 bình luận | Chia sẻ qua WhatsApp
  • Free-threaded CPython là một thay đổi lớn cho phép chạy song song nhiều luồng trong cùng một trình thông dịch
  • Được cung cấp dưới dạng tính năng thử nghiệm trong CPython 3.13
  • Nhờ PEP 703, giờ đây có thể chạy với GIL bị vô hiệu hóa
  • Điều này quan trọng để cải thiện hiệu năng, đặc biệt là hiệu năng đa luồng
  • Giúp tận dụng hiệu quả nhiều lõi CPU

Tuy ấn tượng, nhưng vấn đề là gì?

  • Việc triển khai free-threading ngay trong CPython là một nỗ lực rất lớn
  • Có hai vấn đề chính: an toàn luồng và tương thích ABI
    • An toàn luồng: mã Python thuần có thể hoạt động mà không cần thay đổi, nhưng mã được viết bằng ngôn ngữ khác hoặc mã sử dụng CPython C API thì có thể không như vậy
    • Tương thích ABI: trình thông dịch free-threaded có ABI khác, vì vậy mỗi gói có mô-đun mở rộng cần phải build thêm wheel
  • Các vấn đề về an toàn luồng rất khó để hiểu, cải thiện và kiểm thử
  • Ví dụ: các lỗi thất bại gián đoạn xuất hiện trong numpy#26690, pywavelets#758, v.v.

Kế hoạch sắp tới và công việc của nhóm

  • Sẽ mất vài năm để free-threaded CPython trở thành mặc định
  • Hy vọng trong Python 3.13, nhiều dự án sẽ làm việc về tương thích và phát hành wheel cp313t lên PyPI
  • Nhóm đã bắt đầu làm việc trong vài tháng qua từ tầng thấp nhất của ngăn xếp PyData
  • Với mỗi gói, họ áp dụng một cách tiếp cận tương tự:
    1. Thêm tác vụ CI đầu tiên
    2. Sửa các vấn đề về an toàn luồng và trạng thái dùng chung/toàn cục
    3. Thêm hỗ trợ free-threaded vào các tác vụ CI build wheel
    4. Stress test cục bộ và theo dõi các tác vụ CI
    5. Đánh dấu để mô-đun mở rộng có thể chạy mà không cần GIL
    6. Chuyển sang gói tiếp theo

Tóm tắt của GN⁺

  • Free-threaded CPython là một thay đổi quan trọng có thể cải thiện mạnh hiệu năng đa luồng
  • Giải quyết các vấn đề về an toàn luồng và tương thích ABI là thách thức chính
  • Hy vọng trong Python 3.13, nhiều dự án sẽ làm việc về tương thích và có thể thử nghiệm
  • Các gói lớn như PyTorch cùng nhiều gói nhỏ khác sẽ cần thích nghi với thay đổi này
  • Các dự án liên quan gồm có PyO3 và PyTorch

1 bình luận

 
GN⁺ 2024-07-13
Ý kiến Hacker News
  • Việc loại bỏ GIL của Python mở ra cơ hội cải thiện hiệu năng đáng kể cho nhiều tổ chức và dự án gần như không cần thêm nỗ lực

    • Nếu các thư viện cũ không kịp thích ứng với thay đổi này, các dự án mới có thể giành được thị phần
    • Có thể tránh sự phức tạp và lỗi của multiprocessing, đồng thời dùng thread đơn giản để tận dụng mọi lõi trên các máy lớn
  • Chia sẻ trải nghiệm cài đặt và chạy Python đã loại bỏ GIL trên macOS

    • Đã viết một script ngắn giải thích quy trình cài đặt và những điểm khác biệt
    • Liên kết
  • Người dùng yêu thích sự dễ viết và tính logic của Python hy vọng cách tiếp cận không có GIL sẽ vẫn giống với cách viết Python hiện nay

    • Có nhắc rằng bản thân chưa đào sâu vì multithreading khá khó
  • Tóm tắt tiến độ của Python 3

    • [x] Async
    • [x] Optional static typing
    • [x] Threading
    • [ ] JIT
    • [ ] Efficient dependency management
  • Nhớ lại rằng vào khoảng năm 2007, xử lý song song đã trở thành điều bắt buộc

    • Có nhắc rằng Rust đang chiếm ưu thế về tốc độ và xử lý song song
  • Giải thích trong PEP703 về cách phép toán append của list vẫn giữ được tính an toàn luồng sau khi loại bỏ GIL

    • Đã thêm khóa riêng cho từng list
    • Có nhắc rằng phép tăng số nguyên đơn giản hiện vẫn an toàn luồng nhờ GIL
  • Kỳ vọng việc loại bỏ GIL sẽ thay đổi bản chất của huấn luyện và suy luận ML như thế nào

    • Có thể giảm độ phức tạp của việc truyền bộ nhớ và điều phối tiến trình
    • Kỳ vọng các thư viện như PyTorch sẽ được tối ưu hóa
  • Lo ngại rằng các lập trình viên chưa từng xử lý multithreading thực sự có thể đưa vào những lỗi tinh vi mới

  • Đặt câu hỏi liệu mức suy giảm hiệu năng đơn luồng có nghiêm trọng hay không

    • Không tìm được benchmark, chỉ thấy những lời trấn an chung chung
  • Bày tỏ sự tò mò về cách nó hoạt động với async

    • Có một ranh giới tự nhiên giữa mã I/O-bound và CPU-bound
    • Muốn thấy một mô hình linh hoạt hơn
    • Tò mò liệu JIT có khả thi khi thực hiện "gather" trong các coroutine CPU-bound hay không
    • Cho rằng sẽ rất tuyệt nếu có một mô hình lập trình linh hoạt có thể chuyển đổi nhanh với giao diện tương tự