Générateurs de nombres pseudo-aléatoires parallèles


20

Cette question est principalement liée à un problème pratique d'ingénierie logicielle, mais je serais curieux de savoir si les théoriciens pourraient fournir plus d'informations.


En termes simples, j'ai une simulation de Monte Carlo qui utilise un générateur de nombres pseudo-aléatoires, et je voudrais le paralléliser afin qu'il y ait 1000 ordinateurs exécutant la même simulation en parallèle. Par conséquent, j'ai besoin de 1000 flux indépendants de nombres pseudo-aléatoires.

Peut-on avoir 1000 flux parallèles avec les propriétés suivantes? Ici, devrait être un PRNG très connu et largement étudié avec toutes sortes de belles propriétés théoriques et empiriques.X

  1. Les flux sont prouvablement aussi bons que ce que j'obtiendrais si j'utilisais simplement et divisais le flux généré par en 1000 flux.XXX

  2. Génération du numéro suivant dans un cours d' eau est (presque) aussi vite que la génération du numéro suivant avec .X

Autrement dit: pouvons-nous obtenir plusieurs flux indépendants "gratuitement"?

Bien sûr, si nous utilisions simplement , en rejetant toujours 999 numéros et en choisissant 1, nous aurions certainement la propriété 1, mais nous perdrions dans le temps d'exécution par le facteur 1000.X

Une idée simple serait d'utiliser 1000 copies de , avec les graines 1, 2, ..., 1000. Ce serait certainement rapide, mais ce n'est pas évident si les flux ont de bonnes propriétés statistiques.X


Après quelques recherches sur Google, j'ai trouvé, par exemple, ce qui suit:

  • La bibliothèque SPRNG semble être conçue exactement dans ce but, et elle prend en charge plusieurs PRNG .

  • Le twister de Mersenne semble être un PRNG populaire de nos jours, et j'ai trouvé quelques références à une variante capable de produire plusieurs flux en parallèle.

Mais tout cela est tellement loin de mes propres domaines de recherche, que je n'ai pas pu déterminer ce qui est vraiment à la pointe de la technologie et quelles constructions fonctionnent bien non seulement en théorie mais aussi en pratique.


Quelques clarifications: je n'ai besoin d'aucune sorte de propriétés cryptographiques; c'est pour le calcul scientifique. J'aurai besoin de milliards de nombres aléatoires, afin que nous puissions oublier tout générateur avec une période de .<232

Edit: je ne peux pas utiliser un vrai RNG; J'ai besoin d'un PRNG déterministe. Premièrement, cela aide beaucoup au débogage et rend tout reproductible. Deuxièmement, cela me permet, par exemple, de trouver la médiane de manière très efficace en exploitant le fait que je peux utiliser le modèle multi-passes (voir cette question ).

Edit 2: Il y a une question étroitement liée @ StackOverflow: Générateur de nombres pseudo-aléatoires pour l'environnement de cluster .


6
pourquoi ne pas utiliser le PRNG avec graines échantillonnées indépendamment? je ne comprends pas comment cela ne satisfait pas 1 et 2, car vous n'avez besoin d'aucune coordination entre les différentes machines1000
Sasho Nikolov

Je ne suis pas un expert, mais récemment (en recherchant des informations sur une question TCS) j'ai trouvé ce matériel: idquantique.com/true-random-number-generator/… ... une carte PCI qui peut générer un flux de 16Mbits / sec de (quantique) bits aléatoires. ... vous pouvez en acheter plusieurs et implémenter quelques serveurs générateurs de nombres aléatoires ... ce n'est pas une excellente approche théorique mais les bits sont garantis "bons" :-) :-)
Marzio De Biasi

@Vor: Je voudrais que tout soit reproductible et déterministe. Étant donné une graine fixe, je veux obtenir exactement le même résultat si je réexécute l'expérience. Et je veux pouvoir exécuter la même expérience sur une seule machine et obtenir à nouveau les mêmes résultats. (D'une part, cela aide beaucoup lors du débogage d'algorithmes parallèles ...)
Jukka Suomela

@Jukka: ok! ... et je suppose que le stockage de milliards de bits sauvages décompressables avec les résultats de l'expérience n'est pas si faisable :-) ... un expert PRNG est nécessaire!
Marzio De Biasi

2
Merci pour les réponses fournies jusqu'ici! Voyons voir si nous obtenons plus de participation avec une prime ...
Jukka Suomela

Réponses:


7

Vous pouvez utiliser une évolution de l'algorithme Mersenne Twister développé par Saito et Matsumoto:

SIMD Fast Mersenne Twister (SFMT)

SFMT est un générateur de registre à décalage à rétroaction linéaire (LFSR) qui génère un entier pseudo-aléatoire de 128 bits en une seule étape. SFMT est conçu avec le parallélisme récent des processeurs modernes, tels que le pipelining à plusieurs étapes et les instructions SIMD (par exemple entier 128 bits). Il prend en charge les entiers 32 bits et 64 bits, ainsi que la virgule flottante double précision en sortie. SFMT est beaucoup plus rapide que MT, sur la plupart des plateformes. Non seulement la vitesse, mais aussi les dimensions des équidistributions avec une précision de v-bit sont améliorées. De plus, la récupération d'un état initial de 0 excès est beaucoup plus rapide. Voir la thèse de maîtrise de Mutsuo Saito pour plus de détails .

La période varie de à 2 216091 - 1 .2607122160911

L'utilisation d'un même générateur de nombres aléatoires pour générer plusieurs flux indépendants en modifiant les valeurs initiales peut provoquer un problème (avec une probabilité négligeable). Pour éviter le problème, l'utilisation de paramètres différents pour chaque génération est préférable. Cette technique est appelée création dynamique des paramètres MT.

Dans le code source SFMT, vous pouvez trouver quelques exemples d'ensembles de paramètres (de périodes variables) et un script awk pour convertir un fichier CSV en un ensemble de paramètres compilables. Il existe également un outil appelé " Création dynamique de générateurs Mersenne Twister ".

Les auteurs ont récemment développé une autre version modifiée de Mersenne Twister - Mersenne Twister pour les processeurs graphiques - conçue pour fonctionner dans les GPU et tirer parti de leurs threads d'exécution parallèle natifs. La caractéristique clé est la vitesse: entiers aléatoires toutes les 4,6 ms sur une GeForce GTX 260.5×107

Les périodes de séquence générées sont , 2 23209 - 1 et 2 44497 - 1 pour la version 32 bits, et 2 23209 - 1 , 2 44497 - 1 , 2 110503 - 1 pour la version 64 bits. Il prend en charge 128 ensembles de paramètres pour chaque période, en d'autres termes, il peut générer 128 séquences de nombres pseudo-aléatoires indépendants pour chaque période. Nous avons développé Dynamic Creator pour MTGP, qui génère plus de jeux de paramètres2112131223209124449712232091244497121105031

En effet, ils fournissent un outil MTGPDC pour créer jusqu'à jeux de paramètres (c'est-à-dire des flux indépendants).232

L'algorithme passe les principaux tests de hasard comme Diehard et NIST.

Un article préliminaire est également disponible sur arXiv: une variante de Mersenne Twister adaptée aux processeurs graphiques


Un outil connexe mais plus ancien est Matsumoto et Nishimura (1998): Création dynamique de générateurs de nombres pseudo-aléatoires . Mais je n'ai pas été en mesure de déterminer lesquels de ces outils ne sont qu'une preuve de concept et lesquels sont des progiciels largement utilisés dans l'industrie.
Jukka Suomela

@Jukka: vous pouvez peut-être le demander directement aux auteurs de l'algorithme MTGP. De leur site: "... Toute rétroaction est la bienvenue (envoyez un courriel à Mutsuo Saito, saito" au signe "math.sci.hiroshima-u.ac.jp et m-mat" au signe "math.sci.hiroshima- u.ac.jp) ... ". Peut-être qu'ils ne sont pas à 100% impartiaux, mais ils connaissent sûrement bien les points forts et les points faibles du MTGP, et peuvent vous dire s'il peut convenir à vos purpouses.
Marzio De Biasi

Il semble que Mersenne Twister + Dynamic Creation soit la méthode recommandée pour le faire dans Mathematica.
Jukka Suomela

@Jukka: le package MT + DC est également disponible sur le site de Matsumoto ( math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html ); et je pense que MTGP n'est qu'une variante adaptée aux GPU. Donc MT + DC semble un meilleur choix (et testé / stable) (à moins que vous n'ayez absolument besoin de entiers aléatoires toutes les 4,6 ms sur chaque flux :-))))5×107
Marzio De Biasi

@Vor: Si vous modifiez votre réponse et remplacez MTGP par dcmt , je peux l'accepter.
Jukka Suomela

12

Il semble y avoir de nombreuses façons de résoudre ce problème, mais une façon simple serait d'utiliser le Blum Blum Shub PRNG. Ce PRNG est défini par la relation de récurrence , où N est un semi-premier. Pour obtenir un bit aléatoire de cela, vous pouvez simplement prendre la parité de bit de x i . Ce qui est bien, c'est que puisque x i + k = x 2 k i  mod  N = x 2 k  mod  λ ( N ) iXje+1=Xje2 mod NNXjeXje+k=Xje2k mod N=Xje2k mod λ(N)mod NkO(Journal(N)3)MyXje+1,y=Xje2Mmod λ(N) mod N, oùx0est votre graine. De manière pratique, cela génère exactement le même flux de nombres que si vous utilisiez un seul flux et distribuiez sa sortie à chacune des machines à son tour.X0,y=X02y mod λ(N) mod NX0

Ce n'est pas le plus rapide des PRNG, cependant, il ne sera utile que si les frais généraux de tout ce que vous faites dans la simulation sont nettement supérieurs au coût du PRNG. Cependant, il convient de noter qu'il sera beaucoup plus rapide pour certaines combinaisons de et N que pour d'autres, en particulier si la représentation binaire de 2 M  mod  λ ( N ) contient quelques 1 ou est petite.MN2M mod λ(N)


1
Je pense qu'il serait plus rapide de laisser chaque machine générer une partie contiguë de la séquence, en les espaçant si loin qu'elles ne se croiseront pas. Quoi qu'il en soit, l'utilisation du Blum Blum Shub pour des applications non cryptographiques me semble un peu exagérée.
Antonio Valerio Miceli-Barone

1
@Antonio: Oui, ce serait un peu plus rapide, surtout si vous savez à l'avance exactement combien d'essais vous avez besoin. Si vous ne le savez pas, je pense que vous obtiendrez la même mise à l'échelle dans les deux cas. Wierdly Blum Blum Shub était exactement le PRNG que nous avions imaginé en physique numérique il y a des années. Si vous ne l'utilisez pas à des fins cryptographiques, vous pouvez utiliser un module beaucoup plus petit, donc ce n'est pas vraiment si lent, et pour de nombreuses tâches, il sera rapide par rapport à la fonction de la variable aléatoire que vous devez calculer.
Joe Fitzsimons

5

snX1000ns1,s2,,s10001je1000sjen

X

sjejeX

Xs1je<j1000sjesjs


N'est-ce pas essentiellement la même approche que ce que @Antonio a suggéré: utiliser un PRNG pour générer des graines pour lui-même. J'ai un sentiment un peu mal à l'aise à ce sujet ... Pour donner un exemple trivial de ce qui pourrait mal tourner, considérons un PRNG où output = état interne et la graine définit simplement l'état interne.
Jukka Suomela

@Jukka: Mon approche est similaire à celle d'Antonio, mais la mienne est plus générale. Le PRNG dans votre exemple (où sortie = état interne) ne semble pas être cryptographiquement sécurisé. Un PRNG est cryptographiquement sécurisé si sa sortie ne peut pas être distinguée par calcul de la distribution uniforme. Voir ceci pour plus d'informations. PS: Le Blum-Blum-Shub PRNG remplit cette condition.
MS Dousti

2

FM=1000{0,1,,M-1}jjeF(je+jM)M

Cela vous donnera un RNG cryptographique sur chaque processus, mais il n'a pas nécessairement un coût de performance. AES est rapide si vous avez du matériel qui le prend en charge, et ChaCha est rapide malgré tout. Bien sûr, vous voudrez certainement mesurer cela dans votre environnement spécifique.

F


Si je ne me soucie pas de la force cryptographique, comment ChaCha (compteur) se compare-t-il, par exemple, à Mersenne Twister? Est-ce plus rapide ou plus lent? At-il des propriétés statistiques au moins aussi bonnes? J'ai essayé de google, mais je n'ai trouvé aucun article qui compare ces deux dans un contexte non cryptographique.
Jukka Suomela

2

Il existe maintenant une fonction de saut pour SFMT (une implémentation rapide de Mersenne Twister).

Cela me permet d'initialiser 1000 MT afin qu'il n'y ait pas de chevauchement de cycle. Et SFMT devrait être plus rapide que MTGP. Presque parfait pour mes besoins.


1

Vous pouvez simplement utiliser 1000 instances de Mersenne Twister initialisées avec différentes graines.

Vous pouvez échantillonner les graines d'un autre Twister Mersenne, ou, pour être plus sûr de leur indépendance, du générateur de nombres pseudo-aléatoires du système d'exploitation (/ dev / urandom sous Linux).

Le Mersenne Twister fonctionne toujours sur la même séquence cyclique, la graine contrôle l'endroit où vous commencez à le générer. Avec des graines échantillonnées indépendamment, chaque générateur démarrera à des points différents, généralement très éloignés, avec une très faible probabilité d'intersection.


Donc, MT a de belles propriétés spéciales qui garantissent que l'ensemencement de MT avec un autre MT est logique?
Jukka Suomela

la MT a-t-elle des propriétés pseudo-aléatoires prouvables?
Sasho Nikolov

@Jukka: pas que je sache. C'est pourquoi j'ai suggéré d'utiliser un autre type de PRNG pour l'ensemencement si vous avez particulièrement peur de corrélations étranges et inconnues.
Antonio Valerio Miceli-Barone

@Sasho: la page Wikipedia mentionne la k-distribution et la grande période.
Antonio Valerio Miceli-Barone

1
kk
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.