【发布时间】:2021-04-18 21:17:45
【问题描述】:
我有一个 Julia 代码,我想通过并行运行大量作业(即大约 10,000 个并行作业)将此代码提交到远程计算集群。这段代码的工作方式是,主函数(称为“main.jl”)调用另一个函数(称为“generator.jl”),该函数利用诸如 rand(Float64) 等随机数。我通过 bash 文件提交 main.jl,并通过包含并行运行 N 个作业
#PBS -t 1-N
我想确保为 N 个作业提交中的每一个都使用不同的随机数生成器,但我不确定如何执行此操作。我正在考虑根据环境变量设置随机种子;即,通过设置
@everywhere import Random.Random
@everywhere using Random.Random
Random.seed!(ENV_VAR)
在 main.jl 中。但是,我不确定如何获取环境变量 ENV_VAR。在 MATLAB 中,我知道我可以通过
NUM = getenv( 'PBS_ARRAYID' )
但我不知道如何在 Julia 中执行此操作。如果我设法在 main.jl 中设置这个新的随机种子,每次 bash 脚本将 main.jl 提交到集群时,这会生成不同的随机种子吗?同样,考虑到 Julia RNG 使用 MersenneTwister,我什至需要在 Julia 中执行此操作吗?
以防万一,我一直在远程机器上使用 Julia 1.5.1。
【问题讨论】:
-
相同的种子将给出相同的(随机)序列,因此作为种子的时间戳通常就足够了。问题是两种不同的种子是否可以相互依赖?一个种子在几个步骤后按顺序改变,就像另一个种子开始一样。我把这个留给其他不太懒惰的人回答。
-
@JoopEggen 我想我明白你在说什么。例如,我可以在 main.jl 中以毫秒为单位获取时间戳,然后将随机种子设置为该值。但是,如果我按照上述问题的描述在 .pbs 文件中提交 N 个作业,那么至少其中一些作业不会同时提交吗?
-
由于生日悖论,这种情况经常发生。您不能将时间戳用于集群中的随机数种子。
-
@PrzemyslawSzufel 是否有一种简单、安全的方法可以在 Julia 中为每个作业提交构建不同的随机种子,而不会冒(多次)重复的风险?
-
我正在写答案让你耐心等待......
标签: random julia random-seed