torch.use_deterministic_algorithms¶
- torch.use_deterministic_algorithms(mode, *, warn_only=False)[來源][來源]¶
設定 PyTorch 運算是否必須使用「決定性」演算法。也就是說,對於相同的輸入,並且在相同的軟體和硬體上執行時,演算法總是產生相同的輸出。啟用後,運算將在可用的情況下使用決定性演算法,如果只有非決定性演算法可用,則在呼叫時會拋出
RuntimeError
。注意
僅此設定並不總是足以使應用程式具有可重複性。請參閱 再現性 以取得更多資訊。
注意
torch.set_deterministic_debug_mode()
為此功能提供了一個替代介面。當
mode=True
時,以下通常為非決定性的運算將以決定性的方式執行:在 CUDA 張量上呼叫的
torch.nn.Conv1d
在 CUDA 張量上呼叫的
torch.nn.Conv2d
在 CUDA 張量上呼叫的
torch.nn.Conv3d
在 CUDA 張量上呼叫的
torch.nn.ConvTranspose1d
在 CUDA 張量上呼叫的
torch.nn.ConvTranspose2d
在 CUDA 張量上呼叫的
torch.nn.ConvTranspose3d
當嘗試微分 CUDA 張量時的
torch.nn.ReplicationPad2d
在稀疏-稠密 CUDA 張量上呼叫的
torch.bmm()
當嘗試微分 CPU 張量且索引是張量列表時的
torch.Tensor.__getitem__()
使用
accumulate=False
的torch.Tensor.index_put()
在 CPU 張量上呼叫的使用
accumulate=True
的torch.Tensor.index_put()
在 CPU 張量上呼叫的使用
accumulate=True
的torch.Tensor.put_()
在 CUDA 張量上呼叫的
torch.Tensor.scatter_add_()
在需要 grad 的 CUDA 張量上呼叫的
torch.gather()
在 CUDA 張量上呼叫的
torch.index_add()
當嘗試微分 CUDA 張量時的
torch.index_select()
當嘗試微分 CUDA 張量時的
torch.repeat_interleave()
在 CPU 或 CUDA 張量上呼叫的
torch.Tensor.index_copy()
當 src 類型為 Tensor 且在 CUDA 張量上呼叫的
torch.Tensor.scatter()
當
reduce='sum'
或reduce='mean'
且在 CUDA 張量上呼叫的torch.Tensor.scatter_reduce()
當
mode=True
時,以下通常為非決定性的運算將拋出RuntimeError
:當嘗試微分 CUDA 張量時的
torch.nn.AvgPool3d
當嘗試微分 CUDA 張量時的
torch.nn.AdaptiveAvgPool2d
當嘗試微分 CUDA 張量時的
torch.nn.AdaptiveAvgPool3d
當嘗試微分 CUDA 張量時的
torch.nn.MaxPool3d
當嘗試微分 CUDA 張量時的
torch.nn.AdaptiveMaxPool2d
當嘗試微分 CUDA 張量時的
torch.nn.FractionalMaxPool2d
當嘗試微分 CUDA 張量時的
torch.nn.FractionalMaxPool3d
當嘗試微分 CUDA 張量並使用以下模式之一時的
torch.nn.functional.interpolate()
linear
bilinear
bicubic
trilinear
當嘗試微分 CUDA 張量時的
torch.nn.ReflectionPad1d
嘗試對 CUDA tensor 進行微分時使用
torch.nn.ReflectionPad2d
嘗試對 CUDA tensor 進行微分時使用
torch.nn.ReflectionPad3d
嘗試對 CUDA tensor 進行微分時使用
torch.nn.ReplicationPad1d
嘗試對 CUDA tensor 進行微分時使用
torch.nn.ReplicationPad3d
對 CUDA tensor 呼叫
torch.nn.NLLLoss
嘗試對 CUDA tensor 進行微分時使用
torch.nn.CTCLoss
嘗試對 CUDA tensor 進行微分且
mode='max'
時使用torch.nn.EmbeddingBag
當
accumulate=False
時使用torch.Tensor.put_()
當
accumulate=True
且對 CUDA tensor 呼叫時使用torch.Tensor.put_()
對 CUDA tensor 呼叫時使用
torch.histc()
對 CUDA tensor 呼叫且提供
weights
tensor 時使用torch.bincount()
對 CUDA tensor 呼叫時使用
torch.kthvalue()
對 CUDA tensor 呼叫且輸出索引時使用
torch.median()
嘗試對 CUDA tensor 進行微分時使用
torch.nn.functional.grid_sample()
當 dtype 為浮點數或複數且對 CUDA tensor 呼叫時使用
torch.cumsum()
當
reduce='prod'
且對 CUDA tensor 呼叫時使用torch.Tensor.scatter_reduce()
使用量化 tensor 呼叫時使用
torch.Tensor.resize_()
此外,開啟此設定且開啟
torch.utils.deterministic.fill_uninitialized_memory
時,多個操作會填滿未初始化的記憶體。詳情請參閱該屬性的文件。如果 CUDA 版本為 10.2 或更高版本,除非設定環境變數
CUBLAS_WORKSPACE_CONFIG=:4096:8
或CUBLAS_WORKSPACE_CONFIG=:16:8
,否則少數 CUDA 操作是不具決定性的。詳情請參閱 CUDA 文件:https://docs.nvidia.com/cuda/cublas/index.html#results-reproducibility 如果未設定這些環境變數組態之一,則在使用 CUDA tensor 呼叫這些操作時,將會引發RuntimeError
請注意,決定性操作的效能往往比不具決定性的操作差。
注意
此旗標不會偵測或防止因對具有內部記憶體重疊的 tensor 呼叫 inplace 操作,或將此 tensor 作為操作的
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...