torch.use_deterministic_algorithms¶
- torch.use_deterministic_algorithms(mode, *, warn_only=False)[source][source]¶
設定 PyTorch 操作是否必須使用“確定性”演算法。也就是說,給定相同的輸入,並在相同的軟體和硬體上執行時,始終產生相同輸出的演算法。啟用此設定後,操作在可用時將使用確定性演算法;如果只有非確定性演算法可用,呼叫時將丟擲
RuntimeError。注意
僅此設定並不總是足以使應用程式可重現。有關更多資訊,請參閱可重現性。
注意
torch.set_deterministic_debug_mode()為此功能提供了另一種介面。當
mode=True時,以下通常為非確定性的操作將以確定性方式執行: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()在稀疏-密集 CUDA 張量上呼叫時torch.Tensor.__getitem__()嘗試對 CPU 張量進行微分且索引為張量列表時torch.Tensor.index_put()當accumulate=False時torch.Tensor.index_put()當accumulate=True且在 CPU 張量上呼叫時torch.Tensor.put_()當accumulate=True且在 CPU 張量上呼叫時torch.Tensor.scatter_add_()在 CUDA 張量上呼叫時torch.gather()在需要 grad 的 CUDA 張量上呼叫時torch.index_add()在 CUDA 張量上呼叫時torch.index_select()嘗試對 CUDA 張量進行微分時torch.repeat_interleave()嘗試對 CUDA 張量進行微分時torch.Tensor.index_copy()在 CPU 或 CUDA 張量上呼叫時torch.Tensor.scatter()當 src 型別為 Tensor 且在 CUDA 張量上呼叫時torch.Tensor.scatter_reduce()當reduce='sum'或reduce='mean'且在 CUDA 張量上呼叫時
當
mode=True時,以下通常為非確定性的操作將丟擲RuntimeError: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()嘗試對 CUDA 張量進行微分並使用以下模式之一時linearbilinearbicubictrilinear
torch.nn.ReflectionPad1d嘗試對 CUDA 張量進行微分時torch.nn.ReflectionPad2d嘗試對 CUDA 張量進行微分時torch.nn.ReflectionPad3d嘗試對 CUDA 張量進行微分時torch.nn.ReplicationPad1d嘗試對 CUDA 張量進行微分時torch.nn.ReplicationPad3d嘗試對 CUDA 張量進行微分時torch.nn.NLLLoss在 CUDA 張量上呼叫時torch.nn.CTCLoss嘗試對 CUDA 張量進行微分時torch.nn.EmbeddingBag嘗試對 CUDA 張量進行微分且mode='max'時torch.Tensor.put_()當accumulate=False時torch.Tensor.put_()當accumulate=True且在 CUDA 張量上呼叫時torch.histc()在 CUDA 張量上呼叫時torch.bincount()在 CUDA 張量上呼叫並提供了weights張量時torch.kthvalue()在 CUDA 張量上呼叫時torch.median()在 CUDA 張量上呼叫並輸出索引時torch.nn.functional.grid_sample()嘗試對 CUDA 張量進行微分時torch.cumsum()在 CUDA 張量上呼叫且 dtype 為浮點或複數時torch.Tensor.scatter_reduce()當reduce='prod'且在 CUDA 張量上呼叫時torch.Tensor.resize_()使用量化張量呼叫時
此外,當此設定和
torch.utils.deterministic.fill_uninitialized_memory設定同時開啟時,一些操作會填充未初始化的記憶體。有關更多資訊,請參閱該屬性的文件。如果 CUDA 版本是 10.2 或更高,則少數 CUDA 操作是非確定性的,除非設定了環境變數
CUBLAS_WORKSPACE_CONFIG=:4096:8或CUBLAS_WORKSPACE_CONFIG=:16:8。有關更多詳細資訊,請參閱 CUDA 文件:https://docs.nvidia.com/cuda/cublas/index.html#results-reproducibility 如果未設定這些環境變數配置之一,則在使用 CUDA 張量呼叫這些操作時,將丟擲RuntimeError。請注意,確定性操作的效能通常不如非確定性操作。
注意
此標誌不會檢測或阻止由於在具有內部記憶體重疊的張量上呼叫原地(inplace)操作,或將此類張量作為操作的
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...