Différences entre les versions de « Snow »
Ligne 94 : | Ligne 94 : | ||
'''Exemple de tous les jours :''' Disons qu'on veut écrire une lettre de deux lignes. À la place de l'écrire, vous vous déplacer 3 étages du Pavillon André-Aisenstadt pour aller voir votre ami au troisième étage pour lui demander de l'aide. Pendant ce temps-là vous auriez pu avoir déjà écrit votre lettre de deux lignes. Mais, par exemple si vous avez une lettre de 20 page à écrire, en ce moment-là cela vaut la peine de se déplacer trois étages pour allez demander de l'aide à son ami. | '''Exemple de tous les jours :''' Disons qu'on veut écrire une lettre de deux lignes. À la place de l'écrire, vous vous déplacer 3 étages du Pavillon André-Aisenstadt pour aller voir votre ami au troisième étage pour lui demander de l'aide. Pendant ce temps-là vous auriez pu avoir déjà écrit votre lettre de deux lignes. Mais, par exemple si vous avez une lettre de 20 page à écrire, en ce moment-là cela vaut la peine de se déplacer trois étages pour allez demander de l'aide à son ami. | ||
+ | |||
+ | == Générer des nombres aléatoires == | ||
+ | |||
+ | Les nombres aléatoires générer par défaut sont susceptibles d'être très corrélés. Par exemple : | ||
+ | <pre> | ||
+ | > clusterCall(cl, runif, 3) | ||
+ | [[1]] | ||
+ | [1] 0.08496597 0.35232298 0.60300751 | ||
+ | |||
+ | [[2]] | ||
+ | [1] 0.08496597 0.35232298 0.60300751 | ||
+ | </pre> | ||
== Voir aussi == | == Voir aussi == |
Version du 13 mai 2013 à 13:50
Les calculs statistiques qui exigent des longues procédures, peuvent être accéléré de manière significative en utilisant plusieurs ordinateurs en parallèle.
Le package «snow» (Simple Network Of Workstations) nous donne la possibilité d'avoir un cluster de postes de travail pour les calculs parallèles dans R.
Lancer le script «snowdms» au DMS
- Ouvrez un terminal
- Taper la commande suivante: makeKey.sh (ceci est pour empêcher le SSH de vous demander votre mot de passe à chaque fois que vous tentez de vous connecter à d'autres machines du réseau)
- Si la question suivante apparaît, répondez par «y» :
Generating public/private rsa key pair. /home/bayani/.ssh/id_rsa already exists. Overwrite (y/n)?
- Faites juste «Enter» lorsque vous voyez :
Enter passphrase (empty for no passphrase):
- De nouveau faites juste «Enter» lorsque vous voyez :
Enter same passphrase again:
- Lancer R, en tapant :
/usr/local/stat/R/R-3.0.0/bin/R
Exemple explicatif
Dans l'exemple suivant, on fait des calculs de deux manières. La première fois, on lance les calculs sur la machine qu'on se trouve présentement; par la suite on fait la même chose sur plusieurs CPUs (ex. nbcpus <- 10, 15, 20 ou 80). Une fois dans R, tapez les commandes suivantes :
require(snow) myfunc <- function(M=1000) { decision <- 0 for (i in 1:M) { x <- rnorm(100) if (shapiro.test(x)$p < 0.05) decision <- decision + 1 } return(decision) } system.time({ M <- 6000000 decision <- myfunc(M) print(decision/M) }) # Temps de calcul: 814s # Comme on constate ici, avec un seul CPU le processus prend 814s c.-à-d. environ 14 minutes nbcpus <- 10 cpus <- strsplit(system(paste("snowdms.sh ",nbcpus),intern=TRUE),split=" ")[[1]] system.time({ cl <- makeCluster(cpus, type = "SOCK") #Fonctions pour démarrer un cluster de Snow. clusterSetupSPRNG(cl) #Initialisation de flux de nombres aléatoires uniformes indépendantes pour un cluster de Snow M <- 6000000 out <- clusterCall(cl, myfunc, round(M/nbcpus)) #Fonctions pour le calcul sur un cluster de Snow stopCluster(cl) #Fonctions pour arrêter un cluster de Snow. decision <- 0 for (cpus in 1:nbcpus) { decision <- decision + out[[cpus]] } print(decision/(round(M/nbcpus)*nbcpus)) }) # Avec nbcpus <- 10: 111s # Avec nbcpus <- 15: 84s # Avec nbcpus <- 20: 70s # Avec nbcpus <- 80: 58s # On voit ici qu'au fur et à mesure qu'on augmente le nombre de CPUs le processus va plus vite.
Remarque Des messages tels que :
The authenticity of host 'leopard (132.204.53.53)' can't be established. RSA key fingerprint is a6:a3:80:c8:52:22:d8:de:be:5a:d8:f4:04:cf:2c:01. Are you sure you want to continue connecting (yes/no)?
peuvent apparaître. Il faut alors répondre par «yes». Ces messages n'apparaitont qu'une seule fois (pour une machine donnée).
Nombre de CPUs
Le rendement en terme du temps de calcul dépend du type de processus que vous allez lancer sur les machines. On voit dans l'exemple que plus on utilise de CPUs, plus vite iront les calculs. Mais il faut faire attention puisque, tout dépendamment du type de calculs à réaliser, le gain risque de changer. Il ne faut pas oublier que l'envoi des calculs sur plusieurs CPUs prend du temps, alors il faut que votre processus vaille le coup d'être envoyer sur plusieurs CPUs (c.-à-d. votre programme est bien parallélisable). Sinon, c'est mieux de lancer un programme qui est pas trop grand sur une seule machine.
Exemple de tous les jours : Disons qu'on veut écrire une lettre de deux lignes. À la place de l'écrire, vous vous déplacer 3 étages du Pavillon André-Aisenstadt pour aller voir votre ami au troisième étage pour lui demander de l'aide. Pendant ce temps-là vous auriez pu avoir déjà écrit votre lettre de deux lignes. Mais, par exemple si vous avez une lettre de 20 page à écrire, en ce moment-là cela vaut la peine de se déplacer trois étages pour allez demander de l'aide à son ami.
Générer des nombres aléatoires
Les nombres aléatoires générer par défaut sont susceptibles d'être très corrélés. Par exemple :
> clusterCall(cl, runif, 3) [[1]] [1] 0.08496597 0.35232298 0.60300751 [[2]] [1] 0.08496597 0.35232298 0.60300751