1.env 设置seed
以openAI的gym为例
#创建完环境后
env = gym.make(env_id)
一个是环境需要设置seed,然后动作空间也需要设置seed
env.seed(seed)
env.action_space.seed(seed)
2.random和numpy设置seed
random.seed(seed)
import numpy as np
np.random.seed(seed)
3.torch设置seed
import torch
torch.manual_seed(args.seed)
torch.cuda.manual_seed_all(args.seed)
torch.backends.cudnn.deterministic = True
1. torch.manual_seed(args.seed)
这行代码设置了 PyTorch CPU 和 所有设备上的随机数生成器的种子。它会影响 PyTorch 在 CPU 上生成的随机数序列,如:
初始化模型权重时使用的随机数
数据打乱顺序时用的随机数(如 DataLoader 的 shuffle=True)
确保你在不同设备上运行相同代码时,CPU 的随机行为是一致的。
2. torch.cuda.manual_seed_all(args.seed)
这行代码设置了 所有 GPU 设备上的随机数生成器的种子。因为一个机器可能有多个 GPU,使用 torch.cuda.manual_seed_all(args.seed) 可以确保每个 GPU 上的随机数生成器都是从同一个种子开始,这样可以保证 GPU 上的随机操作(如权重初始化、Dropout等)在不同 GPU 上也是一致的。
3. torch.backends.cudnn.deterministic = True
这行代码强制 CuDNN 使用确定性算法。CuDNN 是 NVIDIA 的深度学习加速库,默认情况下它会使用一些非确定性的算法(这些算法可能更快,但不能保证每次得到相同的结果)。设置 torch.backends.cudnn.deterministic = True 可以让 CuDNN 使用确定性操作,确保即使在使用 GPU 和 CuDNN 的情况下,得到的结果也是一致的。
总结:
torch.manual_seed(args.seed): 保证 CPU 上的随机数行为一致。
torch.cuda.manual_seed_all(args.seed): 保证 GPU 上的随机数行为一致。
torch.backends.cudnn.deterministic = True: 强制 CuDNN 使用确定性算法,确保使用 GPU 时的可重复性。
这三行代码的组合可以确保你的深度学习模型在每次运行时,无论是 CPU 还是 GPU 环境,都会得到一致的结果,方便调试和结果比较。
4.从buffer中取样时候对rng设置seed,这个很容易忽略
rng 是 random number generator(随机数生成器) 的缩写。在这段代码中,rng = np.random.default_rng(seed) 使用了 NumPy 中的新随机数生成器 default_rng 来生成随机数
1.有人以为设置np.random的seed就可以了,实际上这里的rng也要设置seed
2.在代码中分别使用 np.random 和 rng 设置 seed 是因为这两者实际上代表不同的随机数生成机制
3.np.random.seed(seed):这是旧的全局随机数生成器。它控制的是整个 NumPy 模块中所有调用 np.random 相关函数的全局状态。所有依赖随机性的操作(例如 np.random.rand() 或 np.random.choice())都会共享同一个全局状态。
4.default_rng(seed) 返回一个独立的、局部的 Generator 对象,不依赖全局状态。它提供了更多灵活性和更好的隔离性,使得你可以为不同的操作使用独立的生成器对象 rng
rng = np.random.default_rng(seed)
idxs = rng.choice(self.size, batch_size)
3.不需要设置seed的
fastrand不需要设置seed