Đa xử lý python nối vào danh sách toàn cầu

torch.multiprocessing là sự thay thế cho mô-đun multiprocessing của Python. Nó hỗ trợ chính xác các hoạt động tương tự, nhưng mở rộng nó, để tất cả các tenxơ được gửi qua multiprocessing.Queue, sẽ chuyển dữ liệu của chúng vào bộ nhớ dùng chung và sẽ chỉ gửi một chốt điều khiển cho một quy trình khác

Ghi chú

Khi một Tensor được gửi đến một quy trình khác, dữ liệu Tensor được chia sẻ. Nếu torch.Tensor.grad không phải là None, nó cũng được chia sẻ. Sau khi một trường Tensor không có trường torch.Tensor.grad được gửi đến quy trình khác, nó sẽ tạo ra một torch.multiprocessing0 Tensor dành riêng cho quy trình tiêu chuẩn không được chia sẻ tự động trên tất cả các quy trình, không giống như cách dữ liệu của Tensor đã được chia sẻ

Điều này cho phép triển khai các phương pháp đào tạo khác nhau, như Hogwild, A3C hoặc bất kỳ phương pháp nào khác yêu cầu hoạt động không đồng bộ

CUDA trong đa xử lý¶

Thời gian chạy CUDA không hỗ trợ phương pháp bắt đầu torch.multiprocessing3;

Ghi chú

Phương thức bắt đầu có thể được đặt thông qua việc tạo ngữ cảnh bằng torch.multiprocessing6 hoặc trực tiếp bằng cách sử dụng torch.multiprocessing7

Không giống như tenxơ CPU, quá trình gửi bắt buộc phải giữ tenxơ ban đầu miễn là quy trình nhận giữ lại một bản sao của tenxơ. Nó được triển khai ngầm nhưng yêu cầu người dùng tuân theo các phương pháp hay nhất để chương trình chạy chính xác. Ví dụ: quy trình gửi phải tồn tại miễn là quy trình tiêu dùng có tham chiếu đến tensor và việc đếm lại không thể cứu bạn nếu quy trình tiêu dùng thoát bất thường thông qua tín hiệu nghiêm trọng. Xem phần này .

Xem thêm. Sử dụng nn. song song. DistributedDataParallel thay vì đa xử lý hoặc nn. Dữ liệu song song

Các mẹo và phương pháp hay nhất¶

Tránh và chống bế tắc¶

Có rất nhiều thứ có thể sai khi một quy trình mới được tạo ra, với nguyên nhân phổ biến nhất gây ra bế tắc là các luồng nền. Nếu có bất kỳ luồng nào giữ khóa hoặc nhập mô-đun và torch.multiprocessing3 được gọi, thì rất có khả năng quy trình con sẽ ở trạng thái bị hỏng và sẽ bế tắc hoặc lỗi theo một cách khác. Lưu ý rằng ngay cả khi bạn không làm như vậy, thì các thư viện tích hợp sẵn của Python cũng có - không cần tìm đâu xa ngoài multiprocessing. multiprocessing.Queue thực sự là một lớp rất phức tạp, sinh ra nhiều luồng được sử dụng để tuần tự hóa, gửi và nhận các đối tượng và chúng cũng có thể gây ra các sự cố đã nói ở trên. Nếu bạn thấy mình trong tình huống như vậy, hãy thử sử dụng multiprocessing1, không sử dụng bất kỳ chủ đề bổ sung nào

Chúng tôi đang cố gắng hết sức để giúp bạn dễ dàng và đảm bảo những bế tắc này không xảy ra nhưng một số điều nằm ngoài tầm kiểm soát của chúng tôi. Nếu bạn gặp bất kỳ sự cố nào mà bạn không thể giải quyết trong một thời gian, hãy thử liên hệ trên các diễn đàn và chúng tôi sẽ xem liệu đó có phải là sự cố mà chúng tôi có thể khắc phục hay không

Sử dụng lại bộ đệm được chuyển qua Hàng đợi¶

Hãy nhớ rằng mỗi khi bạn đặt một Tensor vào một multiprocessing.Queue, nó phải được chuyển vào bộ nhớ dùng chung. Nếu nó đã được chia sẻ, nó không hoạt động, nếu không, nó sẽ phát sinh một bản sao bộ nhớ bổ sung có thể làm chậm toàn bộ quá trình. Ngay cả khi bạn có một nhóm quy trình gửi dữ liệu đến một quy trình duy nhất, hãy yêu cầu nó gửi lại bộ đệm - điều này gần như miễn phí và sẽ cho phép bạn tránh sao chép khi gửi đợt tiếp theo

Đào tạo đa xử lý không đồng bộ [e. g. Lợn rừng]¶

Sử dụng torch.multiprocessing, có thể đào tạo một mô hình không đồng bộ, với các tham số được chia sẻ mọi lúc hoặc được đồng bộ hóa định kỳ. Trong trường hợp đầu tiên, chúng tôi khuyên bạn nên gửi toàn bộ đối tượng mô hình, trong trường hợp sau, chúng tôi khuyên bạn chỉ nên gửi multiprocessing5

Chúng tôi khuyên bạn nên sử dụng multiprocessing.Queue để chuyển tất cả các loại đối tượng PyTorch giữa các quy trình. Có thể đ. g. kế thừa các tenxơ và bộ lưu trữ đã có trong bộ nhớ dùng chung, khi sử dụng phương pháp khởi động torch.multiprocessing3, tuy nhiên, nó rất dễ bị lỗi và nên được sử dụng cẩn thận và chỉ bởi người dùng nâng cao. Hàng đợi, mặc dù đôi khi chúng là một giải pháp kém tinh tế hơn, sẽ hoạt động bình thường trong mọi trường hợp

Cảnh báo

Bạn nên cẩn thận về việc có các câu lệnh toàn cầu, không được bảo vệ bằng một multiprocessing8. Nếu một phương thức bắt đầu khác với torch.multiprocessing3 được sử dụng, chúng sẽ được thực thi trong tất cả các quy trình con

Lợn rừng¶

Có thể tìm thấy cách triển khai Hogwild cụ thể trong kho ví dụ, nhưng để giới thiệu cấu trúc tổng thể của mã, cũng có một ví dụ tối thiểu bên dưới

Đa xử lý có thể truy cập các biến toàn cục không?

Bạn có thể chia sẻ một biến toàn cầu với tất cả các quy trình worker con trong nhóm đa xử lý bằng cách xác định biến đó trong hàm khởi tạo quy trình worker . Trong hướng dẫn này, bạn sẽ khám phá cách chia sẻ biến toàn cục với tất cả worker trong nhóm quy trình Python.

Đa xử lý Python có sử dụng nhiều lõi không?

Các quy trình Python thường sử dụng một luồng đơn vì GIL. Mặc dù có GIL, các thư viện thực hiện các tác vụ tính toán nặng như numpy, scipy và pytorch sử dụng triển khai dựa trên C hoàn toàn, cho phép sử dụng nhiều lõi .

Đa xử lý có tăng tốc không?

Đa xử lý có thể tăng tốc thời gian thực thi bằng cách tận dụng nhiều phần cứng của bạn hơn hoặc bằng cách tạo một mẫu đồng thời tốt hơn cho vấn đề hiện tại.

Đa xử lý có tăng tốc mã không?

Có thể sử dụng phân luồng và đa xử lý để tăng tốc độ thực thi mã của bạn trong nhiều trường hợp .

Chủ Đề