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.multiprocessing
0 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.multiprocessing
3;
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.multiprocessing
6 hoặc trực tiếp bằng cách sử dụng torch.multiprocessing
7
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.multiprocessing
3 đượ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 multiprocessing
1, 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 multiprocessing
5
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.multiprocessing
3, 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 multiprocessing
8. Nếu một phương thức bắt đầu khác với torch.multiprocessing
3 đượ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