Baidu が提供する paddle+aistudio が優れた深層学習プラットフォームであることは事実ですが、使用中にランダム シードが無効になるようです。
pyotrch ではランダムシードを固定することができます. さまざまな構成を変更しない場合, 何度トレーニングを行ってもトレーニングプロセスが一貫していることを保証できます. 例えば, 各ラウンドの損失と精度は以前のいくつかのトレーニング セッションと同じです。 .
この件に関するいくつかのリンクを次に示します。
https://aistudio.baidu.com/paddle/forum/topic/show/987738
https://aistudio.baidu.com/paddle/forum/topic/show/990814
実験 1: CPU を揃えることができる
Paddle はpaddle.seed(seed)
paddlepaddle のランダム シードを設定でき、いくつかの実験を通じて、CPU をトレーニングに使用する場合、再現性を保証できます。
これは少なくとも私のコードに問題がないことを示しており、入力の違いなどの理由はありません。
ただし、デバイスが GPU に設定されている場合は、アライメントできません。
実験 2: aistudio 以外のプラットフォームでのテスト
今回はpaddle.seed(seed)
固定のランダム シードを使用してテストに 3090 を使用しました。以前はエポックの設定が小さすぎて、少し大きいとまだ揃えられなかった
究極のソリューション
現在の状況に関する限り、パドルは CPU ではランダム シードでのみ整列できますが、GPU では整列できません。
分析によると、畳み込み演算子の不確実性を引き起こすのは GPU 上の cuDNN であるため、特定の畳み込み演算子を設定できます。
export FLAGS_cudnn_deterministic=True
不確定演算子は計算に最適な演算子を探しているため、決定された後は速度が遅くなる可能性があり、どれだけ遅いかは不明です。
まず、ターミナルで環境変数を設定します
aistudio@jupyter-368487-6009734:~$ export FLAGS_cudnn_deterministic=True
環境変数の削除を防ぐために Python に検出を追加します。
メインファイルの先頭に次のコードを追加します, これは環境変数にこれがあるかどうかを確認することを意味しますFLAGS_cudnn_deterministic
. 証拠がない場合, 例外がトリガーされます. このとき, ターミナルで環境変数を再設定するだけです. .
import os
assert os.environ.get('FLAGS_cudnn_deterministic'),print("请设置$:export FLAGS_cudnn_deterministic=True")
print("存在环境变量FLAGS_cudnn_deterministic=True")