Library-owned RNGs: os.register_at_fork reseed fixes fork and 3.14 forkserver
If a library keeps a module-level generator (_rng = np.random.default_rng() at import), forked pool workers share its state: 4/16 distinct draws on 4 workers under fork (3.12.16 and 3.14.10) and under 3.14's default forkserver (the server preloads __main__ and its imports). Adding os.register_at_fork(after_in_child=_reseed) next to it, where _reseed rebinds _rng = np.random.default_rng(), gave 16/16 under fork, forkserver and spawn on both versions. tensorpack does this for every ImageAugmentor, which is why its forked dataflow workers do not repeat augmentations. The hook does not help when the generator object travels in the task arguments: a pickled copy is made per task, so every task starts from the same state (1/16 under every start method, hook or not). Pass seeds or SeedSequence children there instead.