在不同的PyTorch版本或不同的平台上,不保证完全可重复的结果。此外,即使使用相同的种子,在CPU和GPU的执行中,结果也可能无法重现。
以下在6台机器上实验,不设置随机数种子, 有的机器是torch相同的版本,有的不是,对比预测的logits分数和最终的预测结果。测试的是情感模型的预测结果.
不同的torch版本,也会导致预测有一些差异,但是差异很小,预测的分数有14%的差异,但是数千条数据,预测的结果只有一条有差异
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| w69 | CHANGED | rc=0 >> torch==1.8.1
w79 | CHANGED | rc=0 >> torch==1.8.1
w19 | CHANGED | rc=0 >> torch==1.8.1
w39 | CHANGED | rc=0 >> torch==1.7.0+cu110
w09 | CHANGED | rc=0 >> torch==1.9.0+cu111
w89 | CHANGED | rc=0 >> torch==1.9.0+cu111
w99 | CHANGED | rc=0 >> torch==1.9.0
|
预测结果如下:
1 2 3 4 5 6
| 主机19的结果保存到: 19_result.xlsx, 标签占比是Counter({'积极': 351, '中性': 109, '消极': 40}) 主机39的结果保存到: 39_result.xlsx, 标签占比是Counter({'积极': 351, '中性': 109, '消极': 40}) 主机69的结果保存到: 69_result.xlsx, 标签占比是Counter({'积极': 351, '中性': 109, '消极': 40}) 主机79的结果保存到: 79_result.xlsx, 标签占比是Counter({'积极': 351, '中性': 109, '消极': 40}) 主机89的结果保存到: 89_result.xlsx, 标签占比是Counter({'积极': 352, '中性': 109, '消极': 39}) 主机09的结果保存到: 09_result.xlsx, 标签占比是Counter({'积极': 352, '中性': 109, '消极': 39})
|
对比预测结果和logits
相同的torch版本,预测结果相同
1
| diff 09_result.xlsx.json 89_result.xlsx.json
|
不同的torch版本,预测结果不同
1 2
| diff -q 09_result.xlsx.json 19_result.xlsx.json Files 09_result.xlsx.json and 19_result.xlsx.json differ
|
所以我们在复现实验的时候,最好设定随机数种子, 例如
设置random_seed
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import random import torch import numpy as np seed=100 # torch的随机数种子固定,torch.manual_seed已经是支持CPU和GPU了,不需要设置这个torch.cuda.manual_seed_all了 torch.manual_seed(seed) # numpy的随机数种子 np.random.seed(seed) # python的随机数种子 random.seed(seed) # cuDNN的保证每次实验使用相同的算法 torch.backends.cudnn.benchmark = False # 如果改为True,表示速度提升,但是不是同一算法 # 保证每个算法的确定性 torch.backends.cudnn.deterministic = True 或torch.use_deterministic_algorithms(True)
|