【Python】機械学習ライブラリにおける乱数固定
機械学習向けに提供されるライブラリは、内部で乱数を使っていることが多く、何も考えずにプログラムを書くとプログラム実行の度に結果が変わってしまいます(再現性がありません)。 再現性のあるプログラムを書くためには乱数を固定化する必要がありますが、利用するライブラリによって乱数を固定化する方法が異なります。
本記事では、自分が日頃利用しているライブラリについて、再現性を確保するために必要となる手続きをまとめたいと思います。 なお、本記事は自分が頻繁に利用するライブラリに絞って説明していますので、すべての機械学習のライブラリについて網羅できているわけではありません。 また、本記事は随時更新していく予定です。
Python
- ハッシュ生成のランダム化を無効化 参考
os.environ["PYTHONHASHSEED"] = str(seed)
random
- 乱数Seed固定 参考
random.seed(seed)
numpy
- 乱数Seed固定 参考
np.random.seed(seed)
PyTorch
- 乱数Seed固定 参考
torch.manual_seed(seed)
CUDA専用の乱数Seed固定API torch.cuda.manual_seed
もありますが、上記のAPIを実行するだけでCUDA側の乱数Seedも固定してくれるようです。
- cudnn内の非決定的な処理の固定化 参考
torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False
torch.backends.cudnn.benchmark
に False
にすると最適化による実行の高速化の恩恵は得られませんが、テストやデバッグ等に費やす時間を考えると結果としてトータルの時間は節約できる、と公式のドキュメントには記載されていました。