評價此頁

torch.use_deterministic_algorithms#

torch.use_deterministic_algorithms(mode, *, warn_only=False)[source]#

設定 PyTorch 操作是否必須使用“確定性”演算法。也就是說,在相同輸入、相同軟體和硬體上執行時,總是產生相同輸出的演算法。啟用後,操作將在可用時使用確定性演算法,如果僅有非確定性演算法可用,則在呼叫時會丟擲 RuntimeError

注意

僅憑此設定並不足以使應用程式可重現。有關更多資訊,請參閱 可重現性

注意

torch.set_deterministic_debug_mode() 提供了此功能的替代介面。

mode=True 時,以下通常是非確定性的操作將變為確定性操作:

mode=True 時,以下通常是非確定性的操作將丟擲 RuntimeError

此外,當啟用此設定並啟用 torch.utils.deterministic.fill_uninitialized_memory 時,一些操作會填充未初始化的記憶體。有關更多資訊,請參閱該屬性的文件。

一系列 CUDA 操作在 CUDA 版本為 10.2 或更高版本時是非確定性的,除非設定了環境變數 CUBLAS_WORKSPACE_CONFIG=:4096:8CUBLAS_WORKSPACE_CONFIG=:16:8。有關更多詳細資訊,請參閱 CUDA 文件:https://docs.nvidia.com/cuda/cublas/index.html#results-reproducibility 如果未設定其中一個環境變數配置,則在 CUDA 張量上呼叫這些操作時將引發 RuntimeError

請注意,確定性操作通常比非確定性操作效能更差。

注意

此標誌不會檢測或阻止由於將就地操作應用於具有內部記憶體重疊的張量,或將此類張量作為操作的 out 引數而導致的行為。在這些情況下,多個對同一記憶體位置的不同資料寫入可能會發生,並且寫入順序不確定。

引數

mode (bool) – 如果為 True,則使潛在的非確定性操作切換到確定性演算法或丟擲執行時錯誤。如果為 False,則允許非確定性操作。

關鍵字引數

warn_only (bool, optional) – 如果為 True,則沒有確定性實現的で操作將丟擲警告而不是錯誤。預設為 False

示例

>>> torch.use_deterministic_algorithms(True)

# Forward mode nondeterministic error
>>> torch.randn(10, device='cuda').kthvalue(1)
...
RuntimeError: kthvalue CUDA does not have a deterministic implementation...

# Backward mode nondeterministic error
>>> torch.nn.AvgPool3d(1)(torch.randn(3, 4, 5, 6, requires_grad=True).cuda()).sum().backward()
...
RuntimeError: avg_pool3d_backward_cuda does not have a deterministic implementation...