# torch.multiprocessing
# torch.multiprocessing
封裝了`multiprocessing`模塊。用于在相同數據的不同進程中共享視圖。
一旦張量或者存儲被移動到共享單元(見`share_memory_()`),它可以不需要任何其他復制操作的發送到其他的進程中。
這個API與原始模型完全兼容,為了讓張量通過隊列或者其他機制共享,移動到內存中,我們可以
由原來的`import multiprocessing`改為`import torch.multiprocessing`。
由于API的相似性,我們沒有記錄這個軟件包的大部分內容,我們建議您參考原始模塊的非常好的文檔。
**`warning:`**如果主要的進程突然退出(例如,因為輸入信號),Python中的`multiprocessing`有時會不能清理他的子節點。
這是一個已知的警告,所以如果您在中斷解釋器后看到任何資源泄漏,這可能意味著這剛剛發生在您身上。
## Strategy management
```
torch.multiprocessing.get_all_sharing_strategies()
```
返回一組由當前系統所支持的共享策略
```
torch.multiprocessing.get_sharing_strategy()
```
返回當前策略共享CPU中的張量。
```
torch.multiprocessing.set_sharing_strategy(new_strategy)
```
設置共享CPU張量的策略
參數: new\_strategy(str)-被選中策略的名字。應當是`get_all_sharing_strategies()`中值當中的一個。
## Sharing CUDA tensors
共享CUDA張量進程只支持Python3,使用`spawn`或者`forkserver`開始方法。
Python2中的`multiprocessing`只能使用`fork`創建子進程,并且不被CUDA支持。
**`warning:`**CUDA API要求導出到其他進程的分配一直保持有效,只要它們被使用。
你應該小心,確保您共享的CUDA張量不要超出范圍。
這不應該是共享模型參數的問題,但傳遞其他類型的數據應該小心。請注意,此限制不適用于共享CPU內存。
## Sharing strategies
本節簡要概述了不同的共享策略如何工作。
請注意,它僅適用于CPU張量 - CUDA張量將始終使用CUDA API,因為它們是唯一的共享方式。
### File descriptor-`file_descripor`
**`NOTE:`**這是默認策略(除了不支持的MacOS和OS X)。
此策略將使用文件描述符作為共享內存句柄。當存儲被移動到共享內存中,一個由`shm_open`獲得的文件描述符被緩存,
并且當它將被發送到其他進程時,文件描述符將被傳送(例如通過UNIX套接字)。
接收者也將緩存文件描述符,并且`mmap`它,以獲得對存儲數據的共享視圖。
請注意,如果要共享很多張量,則此策略將保留大量文件描述符。
如果你的系統對打開的文件描述符數量有限制,并且無法提高,你應該使用`file_system`策略。
### File system -file\_system
這個策略將提供文件名稱給`shm_open`去定義共享內存區域。
該策略不需要緩存從其獲得的文件描述符的優點,但是容易發生共享內存泄漏。
該文件創建后不能被刪除,因為其他進程需要訪問它以打開其視圖。
如果進程崩潰或死機,并且不能調用存儲析構函數,則文件將保留在系統中。
這是非常嚴重的,因為它們在系統重新啟動之前不斷使用內存,或者手動釋放它們。
為了記錄共享內存文件泄露數量,`torch.multiprocessing`將產生一個守護進程叫做`torch_shm_manager`
將自己與當前進程組隔離,并且將跟蹤所有共享內存分配。一旦連接到它的所有進程退出,
它將等待一會兒,以確保不會有新的連接,并且將遍歷該組分配的所有共享內存文件。
如果發現它們中的任何一個仍然存在,它們將被釋放。我們已經測試了這種方法,并且它已被證明對于各種故障都是穩健的。
如果你的系統有足夠高的限制,并且`file_descriptor`是被支持的策略,我們不建議切換到這個。
- PyTorch 中文文檔
- 主頁
- 自動求導機制
- CUDA語義
- 擴展PyTorch
- 多進程最佳實踐
- 序列化語義
- torch
- torch.Tensor
- torch.Storage
- torch.nn
- torch.nn.functional
- torch.autograd
- torch.optim
- torch.nn.init
- torch.multiprocessing
- torch.legacy
- torch.cuda
- torch.utils.ffi
- torch.utils.data
- torch.utils.model_zoo
- torchvision
- torchvision.datasets
- torchvision.models
- torchvision.transforms
- torchvision.utils
- 致謝