Description
Not for the first time, x86 CI gives us mysterious problems, in that some numerical tests fail on x86 despite all RNGs being thoroughly seeded (i.e. the results should be fully deterministic).
For example, using this runtests.jl
on x64 and x86 GitHub runners will give different results at the end, see https://github.com/penelopeysm/Shaymin.jl/actions/runs/12412993388/job/34653933016
using Test
using StableRNGs
using Random
using Turing
Random.seed!(468)
@testset verbose = true "Shaymin.jl" begin
@testset "using global seed" begin
x1 = randn(3)
@info x1
end
@testset "stablerng" begin
x2 = randn(StableRNG(468), 3)
@info x2
end
@testset "pg" begin
@model function f(y)
a ~ Normal(0, 1)
y ~ Normal(a, 1)
end
Random.seed!(468)
alg = PG(15)
chain = sample(StableRNG(468), f(1.5), alg, 50; progress=false)
@show mean(chain[:a])
end
end
# x64
[ Info: [0.07200886749732076, -0.0740437565595174, 0.6327762377562545]
[ Info: [1.2876157288026433, -0.2953479054222536, -1.205615981210787]
mean(chain[:a]) = 0.7475257036106626
# x86
[ Info: [0.07200886749732076, -0.0740437565595174, 0.6327762377562545]
[ Info: [1.2876157288026433, -0.2953479054222536, -1.205615981210787]
mean(chain[:a]) = 0.7973086809553678
Note that:
- The results are deterministic if run repeatedly on the same architecture, so the problem isn't that the implementation doesn't use the provided
rng
; - The first two testsets with
Random.randn(10)
andrand(StableRNG(468), 10)
are deterministic across architectures, so it's not a mistake in the implementation of the random number generator.
Metadata
Metadata
Assignees
Labels
No labels