如何添加随机种子保证代码每次复现的一致性?

如何添加随机种子保证代码每次复现的一致性?


1. 程序内设定随机种子

  1. 在main()程序中首先设定随机种子:

    def set_seed(seed=42):
    	# 下面两个常规设置了,用来np和random的话要设置 
    	random.seed(seed)
        np.random.seed(seed)
        
        os.environ['PYTHONHASHSEED'] = str(seed)  # 禁止hash随机化
        # os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8'  # 在cuda 10.2及以上的版本中,需要设置以下环境变量来保证cuda的结果可复现
    
        torch.manual_seed(seed)
        torch.cuda.manual_seed(seed)
        torch.cuda.manual_seed_all(seed) # 多GPU训练需要设置这个
        
        # torch.use_deterministic_algorithms(True) # 一些操作使用了原子操作,不是确定性算法,不能保证可复现,设置这个禁用原子操作,保证使用确定性算法
    	torch.backends.cudnn.deterministic = True  # 确保每次返回的卷积算法是确定的
    	torch.backends.cudnn.enabled = False  # 禁用cudnn使用非确定性算法
    	torch.backends.cudnn.benchmark = False  # 与上面一条代码配套使用,True的话会自动寻找最适合当前配置的高效算法,来达到优化运行效率的问题。False保证实验结果可复现。
        
    def main():
    	# 设定随机种子
        set_seed(42)  # 设定随机种子	
    

    重要提示: 在开始Python脚本之前设置环境变量是很重要的。如果你在脚本中设置了PYTHONHASHSEED,那么它只能影响当前脚本运行的子进程,而不会影响当前脚本的hash行为。

2. 系统的环境变量设定随机种子

Windows

  1. 右击“计算机”或“我的电脑”图标,选择“属性”。
  2. 在弹出的系统属性窗口中,点击左侧的“高级系统设置”。
  3. 在系统属性对话框中,点击下方的“环境变量”按钮。
  4. 在环境变量窗口中,你可以选择添加一个新的用户变量,或者系统变量(取决于你想要这个变量是对当前用户有效还是对所有用户有效)。
  5. 点击“新建”来添加一个新的变量。
  6. 在变量名字段中输入PYTHONHASHSEED
  7. 在变量值字段中输入42
  8. 点击“确定”来保存新的环境变量。
  9. 重启你的计算机,或者重新打开命令提示符窗口,以使变量更改生效。

Linux

对于Linux系统,你可以通过修改用户的.bashrc文件或全局的profile文件来设置环境变量。以下是具体步骤:

  1. 打开终端。

  2. 输入以下命令之一来编辑相应的文件:

    • 对于当前用户的.bashrc文件:

      vim ~/.bashrc
      
    • 或者,对于所有用户的全局环境变量,编辑/etc/profile.bash_profile文件(取决于你的Linux发行版):

      sudo vim /etc/profile
      

      或者

      vim ~/.bash_profile
      
  3. 在打开的文件中,添加以下行:

    export PYTHONHASHSEED=42
    
  4. 保存并退出编辑器。

  5. 为了使更改生效,你需要重新加载配置文件,可以通过以下命令之一来完成:

    • 如果你编辑的是.bashrc

      source ~/.bashrc
      
    • 如果你编辑的是/etc/profile.bash_profile

      source /etc/profile
      

      或者

      source ~/.bash_profile
      

    或者,你可以简单地关闭并重新打开终端窗口。

通过以上步骤,你就可以在Windows和Linux操作系统中设置环境变量PYTHONHASHSEED的值为42了。这个变量通常用于控制Python哈希函数的随机种子,以便在不同的运行中保证哈希的一致性。

3. 程序的多线程设定随机种子

  1. Dataloader设定随机种子
    def seed_worker(worked_id):
        worker_seed = torch.initial_seed() % 2**32
        np.random.seed(worker_seed)
        random.seed(worker_seed)
    
    Data.DataLoader(
        dataset=xxx, 
        batch_size=xxx,  
        shuffle=xxx,  
        # 关键是下面这两个,上面自己随便设置
        worker_init_fn=seed_worker,
        num_workers=0,
    )
    
  2. 遇到某些程序可能存在多线程的情况,还需要设置为单线程:
    from gensim.models import Word2Vec
    # workers=1 设置为单线程
    w2v = Word2Vec(sentences, size=emb_dim, min_count=1, seed=seed, workers=1)
    

4. pycharm 调试设置环境变量中的随机种子

  • 如果在pycharm中调试,请设置pycharm中的环境变量:python PYTHONHASHSEED=42
    在这里插入图片描述
    在这里插入图片描述

参考文献

Pytorch坑——模型可复现性实现,随机种子设置-Hilbob-CSDN

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值