PyTorchの再現性/再現性のある実験関連の設定

知乎—アルクサンダーの侵略と削除

住所: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,
)

私はあなたが好きになると思います:

72fc80d5f65a820db7b7bd6430ca16c6.png GANのアルバムシリーズをチェックしてみてください〜!

ランチテイクアウト、CVビジョンの最前線になりましょう!

110以上の記事!CVPR 2021の最も完全なGANペーパーの要約!

100以上の記事!CVPR 2020で最も完全なGANペーパーの要約!

新しいGANの分解:分離された表現MixNMatch

StarGANバージョン2:マルチドメインダイバーシティ画像の生成

添付ダウンロード|「説明可能な機械学習」の中国語版

添付ダウンロード|「TensorFlow2.0ディープラーニングアルゴリズムコンバット」

添付ダウンロード|「コンピュータビジョンの数学的方法」の共有

「深層学習に基づく表面欠陥検出方法のレビュー」

ゼロショット画像分類のレビュー:10年の進歩

「ディープニューラルネットワークに基づく数ショット学習のレビュー」

e2284e9f87ba9bb4ec0ee80e174dad96.png

おすすめ

転載: blog.csdn.net/lgzlgz3102/article/details/123492461