Sorry if I'm misunderstanding your question here Chris.

On Tue, Jan 9, 2018 at 4:58 PM, kellen sunderland <
kellen.sunderl...@gmail.com> wrote:

> I think the convention is that random generators in most modern languages
> are always seeded, and always deterministic.  If a user seed isn't
> supplied, implementations generally provide their own seed, which they
> attempt to make unique.  Often they generate a seed that takes into account
> the current time.  This is at least the case for many mainstream languages.
>
> Java implementation: https://docs.oracle.com/javase/8/docs/api/
> java/util/Random.html
> Remarks: "If two instances of Random are created with the same seed, and
> the same sequence of method calls is made for each, they will generate and
> return identical sequences of numbers."
>
> C#: https://msdn.microsoft.com/en-us/library/ctssatww(v=vs.110).aspx
> Remarks: "Providing an identical seed value to different Random objects
> causes each instance to produce identical sequences of random numbers. This
> is often done when testing apps that rely on random number generators."
>
> On Tue, Jan 9, 2018 at 4:27 PM, Chris Olivier <cjolivie...@gmail.com>
> wrote:
>
>> wait wait — i don’t think that random number generators should return
>> deterministic lists of numbers. i’m asking if something says it’s supposed
>> to. i know they tend to, but my understanding is that they tend to because
>> of the challenge of generating true random numbers from hardware.  IMHO
>> the
>> ideal random number generator would not return a determinaiticnset if
>> numbers regardless of seed.
>>
>> On Tue, Jan 9, 2018 at 3:43 AM Pedro Larroy <pedro.larroy.li...@gmail.com
>> >
>> wrote:
>>
>> > For enabling parallel deterministic testing we can set an environment
>> > variable and set the same seed on different devices for those cases
>> > where we want it, leaving the default as it is. I think this would be
>> > an easy solution that wouldn't change any behaviour in training on
>> > multi-gpu.
>> >
>> > On Tue, Jan 9, 2018 at 10:48 AM, kellen sunderland
>> > <kellen.sunderl...@gmail.com> wrote:
>> > > Thanks Asmus, yes this is also the approach I would be in favour of.
>> I
>> > > think we should optionally allow the user to specify if they want
>> > > deterministic behaviour independent of the GPU they run on.  If MXNet
>> is
>> > > going to support more arbitrary linear algabra operations I could see
>> a
>> > lot
>> > > of use cases for this.  For example I want deterministic noise fed
>> into a
>> > > deep-RL simulation so that I can compare a few different algorithms
>> > without
>> > > variance, and do it in parallel on my machine (that happens to have
>> two
>> > > GPUs).
>> > >
>> > > On Tue, Jan 9, 2018 at 10:36 AM, Asmus Hetzel
>> > <asmushet...@yahoo.de.invalid>
>> > > wrote:
>> > >
>> > >>  The issue is tricky. Number generators should return deterministic
>> sets
>> > >> of numbers as Chris said, but that usually only applies to
>> > non-distributed
>> > >> systems. And to some extend, we have already a distributed system as
>> > soon
>> > >> as one cpu and one gpu is involved.
>> > >> For the usual setup like distributed training, using different seeds
>> on
>> > >> different devices is a must. You distribute a process that involves
>> > random
>> > >> number generation and that means that you absolutely have to ensure
>> that
>> > >> the sequences on the devices do not correlate. So this behaviour is
>> > >> intended and correct. We also can not guarantee that random number
>> > >> generation is deterministic when running on CPU vs. running on GPU.
>> > >> So what we are dealing here is generating repeatable results, when
>> the
>> > >> application/code section is running on a single GPU out of a bigger
>> set
>> > of
>> > >> available GPUs, but we do not have control on which one. The crucial
>> > line
>> > >> in mxnet is this one (resource.cc):
>> > >>
>> > >> const uint32_t seed = ctx.dev_id + i * kMaxNumGPUs + global_seed *
>> > >> kRandMagic;
>> > >> Here I think it would make sense to add a switch that optionally
>> makes
>> > >> this setting independent of ctx.dev_id. But we would have to document
>> > >> really well that this is solely meant for specific types of
>> > debugging/unit
>> > >> testing.
>> > >>
>> > >>
>> > >>
>> > >>
>> > >>
>> > >>
>> > >>
>> > >>
>> > >>     Am Montag, 8. Januar 2018, 19:30:02 MEZ hat Chris Olivier <
>> > >> cjolivie...@gmail.com> Folgendes geschrieben:
>> > >>
>> > >>  Is it explicitly defined somewhere that random number generators
>> should
>> > >> always return a deterministic set of numbers given the same seed, or
>> is
>> > >> that just a side-effect of some hardware not having a better way to
>> > >> generate random numbers so they use a user-defined seed to kick off
>> the
>> > >> randomization starting point?
>> > >>
>> > >> On Mon, Jan 8, 2018 at 9:27 AM, kellen sunderland <
>> > >> kellen.sunderl...@gmail.com> wrote:
>> > >>
>> > >> > Hello MXNet devs,
>> > >> >
>> > >> > I wanted to see what people thought about the follow section of
>> code,
>> > >> which
>> > >> > I think has some subtle pros/cons:
>> > >> > https://github.com/apache/incubator-mxnet/blob/
>> > >> > d2a856a3a2abb4e72edc301b8b821f0b75f30722/src/resource.cc#L188
>> > >> >
>> > >> > Tobi (tdomhan) from sockeye pointed it out to me after he spent
>> some
>> > time
>> > >> > debugging non-determinism in his model training.
>> > >> >
>> > >> > This functionality is well documented here:
>> > >> > https://mxnet.incubator.apache.org/api/python/ndarray.
>> > >> > html#mxnet.random.seed
>> > >> > but I don't think the current api meets all use cases due to this
>> > >> section:
>> > >> >
>> > >> > "Random number generators in MXNet are device specific. Therefore,
>> > random
>> > >> > numbers generated from two devices can be different even if they
>> are
>> > >> seeded
>> > >> > using the same seed."
>> > >> >
>> > >> > I'm guessing this is a feature that makes distributed training
>> easier
>> > in
>> > >> > MXNet, you wouldn't want to train the same model on each GPU.
>> However
>> > >> the
>> > >> > downside of this is that if you run unit tests on a multi-gpu
>> system,
>> > or
>> > >> in
>> > >> > a training environment where you don't have control over which GPU
>> you
>> > >> use,
>> > >> > you can't count on deterministic behaviour which you can assert
>> > results
>> > >> > against.  I have a feeling there are non-unit test use cases where
>> > you'd
>> > >> > also want deterministic behaviour independent of which gpu you
>> happen
>> > to
>> > >> > have your code scheduled to run on.
>> > >> >
>> > >> > How do others feel about this?  Would it make sense to have some
>> > optional
>> > >> > args in the seed call to have the seed-per-device functionality
>> turned
>> > >> off?
>> > >> >
>> > >> > -Kellen
>> > >> >
>> > >>
>> > >>
>> >
>>
>
>

Reply via email to