为何设置所有随机种子后torch.randn仍无法复现结果?
解决torch.randn(1)结果无法复现的问题
关键修复步骤
每次生成随机数前必须重置种子
Jupyter Notebook里单元格的执行顺序容易打乱,或者多次运行后随机状态已经被修改。别只设置一次种子,要在每次调用torch.randn(1)之前重新初始化所有种子。示例代码:seed = 42 # 每次生成随机数前都跑这段初始化 torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) np.random.seed(seed) torch.backends.cudnn.deterministic = True torch.use_deterministic_algorithms(True) torch.backends.cudnn.benchmark = False # 生成并打印随机数 print(torch.randn(1))排查CUDA环境的确定性配置
哪怕你生成的是CPU张量,CUDA环境的设置也可能影响随机性。确保torch.use_deterministic_algorithms(True)已经开启,同时注意别让其他后台代码偷偷修改随机状态。先在CPU上验证(排除CUDA干扰)
可以先强制用CPU生成随机数,看看能不能复现:seed = 42 torch.manual_seed(seed) # 指定CPU设备 print(torch.randn(1, device='cpu'))如果CPU上能固定输出,说明问题出在CUDA状态管理,这时候要保证每次运行都彻底重置CUDA的随机状态。
Jupyter环境的特殊处理
Jupyter内核会保留之前的运行状态,要是你之前跑过其他带随机数的代码,内核里的随机状态已经变了。可以试试:- 重启Jupyter内核,只运行包含种子设置和torch.randn(1)的单元格
- 别把种子设置和随机数调用拆在不同单元格,尽量放在同一个单元格里执行
验证效果
按上面的步骤来,seed设为42时,同一PyTorch版本下,CPU上的输出会固定成tensor([0.3367])(不同版本数值可能略有差异,但同一版本下绝对固定),CUDA设备上的输出也会对应固定值。
内容的提问来源于stack exchange,提问作者amew
相关产品推荐
相关产品推荐

