torch版本和随机数

在不同的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)

torch版本和随机数
https://johnson7788.github.io/2022/04/14/torch%E7%89%88%E6%9C%AC%E5%92%8C%E9%9A%8F%E6%9C%BA%E6%95%B0/
作者
Johnson
发布于
2022年4月14日
许可协议