知乎—アルクサンダーの侵略と削除
住所:https://zhuanlan.zhihu.com/p/448284000
01
実験は再現可能です
深層学習のトレーニングプロセスでは、ランダムな初期化とサンプル読み取りのランダム性により、繰り返しの実験の結果が異なり、個々のケースが大きく変動することさえあります。一般に、厳密で実験的な結論を再現/再現できるようにするために、通常、結果を確実にするために固定のランダムシードが採用されます。
02
決定論的設定
1ランダムシード設定
ランダム関数は、モデルパラメータのランダムな初期化やサンプルのシャッフルなど、不確実性の最大の原因です。
PyTorchランダムシード
Pythonランダムシード
numpyランダムシード
# PyTorch
import torch
torch.manual_seed(0)
# python
import random
random.seed(0)
# Third part libraries
import numpy as np
np.random.seed(0)
CPUバージョンでは、上記のランダムシード設定が完了すると、基本的に実験の再現性を実現できます。
GPUバージョンの場合、不確定な結果を実装するアルゴリズムが多数あります。このアルゴリズムは実装が非常に効率的ですが、戻り値が毎回完全に同じになるわけではありません。主に浮動小数点の精度が破棄されるため、さまざまな浮動小数点数がさまざまな順序で追加され、値にわずかな違い(小数点以下第2位)が生じる場合があります。
2GPUアルゴリズムの決定論的実装
GPUアルゴリズムの不確実性には2つの原因があります
CUDA畳み込みベンチマーク
非決定論的アルゴリズム
CUDA畳み込みベンチマークは、運用効率を向上させることです。モデルパラメータがテストされた後、最適な実装が選択されます。さまざまなハードウェアとベンチマーク自体にノイズがあり、不確実性につながります
非決定論的アルゴリズム:GPUの最大の利点は並列計算です。順序を無視できれば、同期要件を回避でき、運用効率を大幅に向上させることができます。したがって、多くのアルゴリズムには、非決定論的結果をもたらすアルゴリズム実装があります。use_deterministic_algorithmsを設定することにより、pytorchに決定論的アルゴリズムを選択させることができます。
# 不需要benchmarking
torch.backends.cudnn.benchmark=False
# 选择确定性算法
torch.use_deterministic_algorithms()
ランタイムエラー
PyTorch関数インターフェースの場合、決定論的アルゴリズムの実装はなく、非決定論的アルゴリズムの実装のみがあり、use_deterministic_algorithms()が同時に設定されるため、ランタイムエラーが発生します。例えば:
>>> import torch
>>> torch.use_deterministic_algorithms(True)
>>> torch.randn(2, 2).cuda().index_add_(0, torch.tensor([0, 1]), torch.randn(2, 2))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: index_add_cuda_ does not have a deterministic implementation, but you set
'torch.use_deterministic_algorithms(True)'. ...
間違った理由:
index_addの決定論的な実装はありません。このエラーは通常、APIインターフェースtorch.index_selectを呼び出すか、tensor.index_add_を直接呼び出すことによって発生します。
解決:
呼び出されたインターフェイスを置き換えて、決定論的な実装を自分で定義します。torch.index_selectインターフェースの場合、以下の実装が可能です。
def deterministic_index_select(input_tensor, dim, indices):
"""
input_tensor: Tensor
dim: dim
indices: 1D tensor
"""
tensor_transpose = torch.transpose(x, 0, dim)
return tensor_transpose[indices].transpose(dim, 0)
サンプル読み取りランダム
1.マルチスレッドの場合、各スレッドが読み取るランダムシードを設定します
2.サンプルジェネレーターをセットアップします
# 设置每个读取线程的随机种子
def seed_worker(worker_id):
worker_seed = torch.initial_seed() % 2**32
numpy.random.seed(worker_seed)
random.seed(worker_seed)
g = torch.Generator()
# 设置样本shuffle随机种子,作为DataLoader的参数
g.manual_seed(0)
DataLoader(
train_dataset,
batch_size=batch_size,
num_workers=num_workers,
worker_init_fn=seed_worker,
generator=g,
)
私はあなたが好きになると思います:
110以上の記事!CVPR 2021の最も完全なGANペーパーの要約!
100以上の記事!CVPR 2020で最も完全なGANペーパーの要約!
StarGANバージョン2:マルチドメインダイバーシティ画像の生成
添付ダウンロード|「TensorFlow2.0ディープラーニングアルゴリズムコンバット」