pytorch多程序最佳實踐

2021-10-07 13:22:21 字數 2707 閱讀 7248

torch.multiprocessing是 python 的multiprocessing多程序模組的替代品。它支援完全相同的操作,但對其進行了擴充套件,以便所有通過多程序佇列multiprocessing.queue傳送的張量都能將其資料移入共享記憶體,而且僅將其控制代碼傳送到另乙個程序。

注意:

當張量tensor被傳送到另乙個程序時,張量的資料和梯度torch.tensor.grad都將被共享。

這一特性允許實現各種訓練方法,如 hogwild,a3c 或任何其他需要非同步操作的訓練方法。

僅 python 3 支援程序之間共享 cuda 張量,我們可以使用spawnforkserver啟動此類方法。 python 2 中的multiprocessing多程序處理只能使用fork建立子程序,並且cuda執行時不支援多程序處理。

警告:

cuda api 規定輸出到其他程序的共享張量,只要它們被這些程序使用時,都將持續保持有效。您應該小心並確保您共享的 cuda 張量不會超出它應該的作用範圍(不會出現作用範圍延伸的問題)。這對於共享模型的引數應該不是問題,但應該小心地傳遞其他型別的資料。請注意,此限制不適用於共享的 cpu 記憶體。

也可以參閱:, 使用 nn.dataparallel 替代多程序處理

1、避免和防止死鎖

產生新程序時會出現很多錯誤,導致死鎖最常見的原因是後台執行緒。如果有任何持有鎖或匯入模組的執行緒,並且fork被呼叫,則子程序很可能處於崩潰狀態,並且會以不同方式死鎖或失敗。請注意,即使您沒有這樣做,python 中內建的庫也可能會,更不必說多程序處理了。multiprocessing.queue多程序佇列實際上是乙個非常複雜的類,它產生了多個用於序列化、傳送和接收物件的執行緒,並且它們也可能導致上述問題。如果您發現自己處於這種情況,請嘗試使用multiprocessing.queues.******queue,它不使用任何其他額外的執行緒。

我們正在盡可能的為您提供便利,並確保這些死鎖不會發生,但有些事情不受我們控制。如果您有任何問題暫時無法應對,請嘗試到論壇求助,我們會檢視是否可以解決問題。

2、重用通過佇列傳送的緩衝區

請記住,每次將張量放入多程序佇列multiprocessing.queue時,它必須被移動到共享記憶體中。如果它已經被共享,將會是乙個空操作,否則會產生乙個額外的記憶體拷貝,這會減慢整個過程。即使您有一組程序將資料傳送到單個程序,也可以讓它將緩衝區傳送回去,這幾乎是不佔資源的,並且可以在傳送下一批時避免產生拷貝動作。

3、非同步多程序訓練(如: hogwild)

使用多程序處理torch.multiprocessing,可以非同步地訓練乙個模型,引數既可以一直共享,也可以週期性同步。在第一種情況下,我們建議傳送整個模型物件,而在後者中,我們建議只傳送狀態字典state_dict()

我們建議使用多程序處理佇列multiprocessing.queue在程序之間傳遞各種 pytorch 物件。使用fork啟動乙個方法時,它也可能會繼承共享記憶體中的張量和儲存空間,但這種方式也非常容易出錯,應謹慎使用,最好只能讓高階使用者使用。而佇列,儘管它們有時候不太優雅,卻能在任何情況下正常工作。

警告:

你應該留意沒有用if __name__ =='__main__'來保護的全域性語句。如果使用了不同於fork啟動方法,它們將在所有子程序中執行。

4、hogwild

具體的 hogwild 實現可以在 示例庫 中找到,但為了展示**的整體結構,下面還有乙個最簡單的示例:

import torch.multiprocessing as mp

from model import mymodel

deftrain

(model)

:# 構建 data_loader,優化器等

for data, labels in data_loader:

optimizer.zero_grad(

) loss_fn(model(data)

, labels)

.backward(

) optimizer.step(

)# 更新共享的引數

if __name__ ==

'__main__'

: num_processes =

4 model = mymodel(

)# 注意:這是 "fork" 方法工作所必需的

model.share_memory(

) processes =

for rank in

range

(num_processes)

: p = mp.process(target=train, args=

(model,))

p.start(

)for p in processes:

p.join(

)

python多程序 Python多程序實踐

建立程序方式如下 可以通過lock鎖機制實現共享鎖,但比較常用的方式還是以上這些方式,效率更高,更安全。使用方式 構造 類方法 使用方式 構造 更多型別支援一般使用manager,支援的型別包括list,dict,namespace,lock,rlock,semaphore,boundedsemap...

Pytorch 多程序在單卡上測試

有些煉丹師可能機器不足,只有一張卡,然後訓練完成了,想要測試的時候,受限於影象樣本size不一致,不能合併到乙個batch中。當然解決方案很多,但有一種更自然的辦法,既使用任意解析度的輸入,同樣使用多程序在單卡上並行執行資料的測試,從而加快測試速度,趕上dideline。大家都知道pytorch官方...

PHP多程序任務學習實踐

直接上 ini set display errors off error reporting e all e warning e notice 作用是每執行一次低階語句會檢查一次該程序是否有未處理過的訊號,ticks控制語句執行的條數 declare ticks 1 class jobdaemond...