IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Parallélisation R: remplir une matrice de résultat


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur d'études / Biostatisticien
    Inscrit en
    Décembre 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études / Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 354
    Par défaut Parallélisation R: remplir une matrice de résultat
    Bonjour, depuis peu je me suis mis à reprendre mes codes classiques pour tous les paralléliser sur le serveur de ma boîte.

    En gros ce que font mes programmes c'est pour chaque itération i, remplir à la ligne i des colonnes contenant des informations comme le nom des variables en cours, la taille de population, les résultats pour différentes méthodes d'analyse multivariée.

    Finalement mon code se résume en une boucle for que j'ai transformé en foreach pour accéder au mode parallélisé (je suis bien sous Revolution R).

    Mais voilà, j'ai un souci pour remplir ma fameuse matrice de résultat, en fin de programme j'ai que des 0 (soit l'état originel de ma matrice) et j'ai téléchargé le manuel ParallelR Lite User's Guide version 3.2 et j'ai l'impression que sous parallélisation il faut reconsidérer totalement cette approche, ce qui m'étonne un peu étant donné que je trouvais naturel que pour une table de données vide à n lignes quand i varie entre 1 et n et bien les résultats calculés à l'étape i étaient insérés à la ligne i du tableau. Et puis je suis persuadé que les developpeurs ont mis en place le parallélisme sous R en se doutant bien qu'une majeure partie de programme se base sur ce type de squelette.

    Un exemple simplifié et totalement représentatif de la structure de mes programmes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    library(foreach)
    library(doMC)
    registerDoMC(8)
     
    Resultat = matrix(0,nbCombi,5)
    foreach(i = nbCombi, .combine = c) %dopar%
    { 
    Resultat[i,1] = "variables"
    Resultat[i,2] = population
    Resultat[i,3] = Reg_log
    Resultat[i,4] = Analyse_discrim
    Resultat[i,5] = SVM
    }
    En vous remerciant d'avance pour votre intérêt à mon problème.

  2. #2
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Bonjour,

    Je relève plusieurs erreurs dans ton code :
    1. À l'instar des fonctions de la famille des apply et à l'inverse des for, while, etc., foreach retourne une valeur. C'est d'ailleurs bien pour ça que tu définis une fonction de "combinaison" des résultats ( dans ton exemple)
    2. Comme pour les apply & co. cette fonction travaille dans un nouvel environnement, et donc des assignations de valeurs sur des objets de ton environnement global ne fonctionneront qu'avec des assignations globales (ou assign avec l'environnement qui va bien en argument)... perso je ne m'y risquerais pas, ne sachant pas ce que ça peut donner sur du travail en parallèle.
    3. foreach doit prendre en argument une séquence ou bien un "itérateur" (tel que défini par le package). De ce que je comprends de ton exemple, tu lui passes un simple nombre pour i => une seule boucle !


    Voici donc comment je procèderais :
    • si tu souhaites vraiment une sortie sous fomre de matrice :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      Resultat <- foreach(i = icount(nbCombi), .combine = rbind) %dopar%
      {
          ## Calcul des différentes variables à mettre ici j'imagine...
      
          ## Résultat retourné sous forme de matrice (rbind sur des vecteurs) :
          c(C1="variables", C2=population, C3=Reg_log, C4=Analyse_discrim, C5=SVM)
      }
    • sinon (différents types de données) je te recommande une sortie en data.frame :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      Resultat <- foreach(i = icount(nbCombi), .combine = rbind) %dopar%
      {
          ## Calcul des différentes variables à mettre ici j'imagine...
      
          ## Résultat retourné sous forme de data.frame :
          data.frame(C1="variables", C2=population, C3=Reg_log, C4=Analyse_discrim, C5=SVM)
      }

    Tu noteras :
    1. que "Resultat" n'a plus besoin d'être pré-défini, c'est la sortie de foreach.
    2. l'utilisation d'un itérateur icount pour i (tu devrais également pouvoir utiliser 1:nbCombi ou un équivalent).
    3. l'utilisation de rbind comme fonction d'agrégation, puisque l'on souhaite voir les résultats de chaque itération sur une ligne.


    Petite remarque au passage... il est dit dans la documentation du package que l'utilisation de foreach n'est intéressante que lorsque chaque itération prend un temps considérable (ordre de grandeur de la seconde ou >). Dans le cas contraire, cette méthode risque d'être moins efficace que les traditionnelles méthodes de vectorisation et même que des boucles for !

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur d'études / Biostatisticien
    Inscrit en
    Décembre 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études / Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 354
    Par défaut
    Salut pitipoissin et merci pour ton intérêt à mon topic.

    En fait j'avais trouvé la solution hier aprés ya voir passé une grosse journée, comme tu l'as bien compris je suis encore de la vieille école et j'utilise pas du tout apply dans mes programmes lol (je sais c'est un tord mais le manque de temps... ).

    En tout cas c'est agréable de croiser un autre français qui s'y connait en parallélisation (sur un autre forum j'ai eu le plaisir de croiser un débutant un peu plus avancé que moi sur ce thème)! le manque d'infos sur la parallélisation est flagrante, et il m'a fallu une bonne journée pour tomber sur le package snow qui simplifie complètement le lancement des coeurs.

    Encore merci à toi, ta solution m'a éclairci un peu plus les idées sur comment penser les programmes pour pouvoir les paralléliser désormais!

  4. #4
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Citation Envoyé par joyeux_lapin13 Voir le message
    En tout cas c'est agréable de croiser un autre français qui s'y connait en parallélisation (sur un autre forum j'ai eu le plaisir de croiser un débutant un peu plus avancé que moi sur ce thème)! le manque d'infos sur la parallélisation est flagrante, et il m'a fallu une bonne journée pour tomber sur le package snow qui simplifie complètement le lancement des coeurs.
    Houlà, je suis loin de m'y connaître !
    J'avais juste regardé rapidement ce qui se faisait dans le domaine et je commence à bien m'y retrouver dans la philosophie de programmation R. Mais travaillant sous Windows (un peu contre mon gré), je calais jusque là sur l'utilisation de plusieurs cœurs... Merci pour le tuyau "snow", ça a l'air de marcher du tonnerre

    PS. Je t'encourage vraiment à te familiariser avec les [tlsm...]apply, c'est vraiment plus efficace que les boucles.

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur d'études / Biostatisticien
    Inscrit en
    Décembre 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études / Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 354
    Par défaut
    Plutot que de créer un nouveau thread je vais me resservir de celui de base, surtout que ma nouvelle problématique coïncide avec le thème!

    En fait je cherche maintenant à paralléliser dans mes itérations qui tournent en parallèle! si ma première boucle foreach permet de traiter plusieurs combinaisons en même temps, j'aimerais en faire une nouvelle qui permet de traiter les méthodes de modélisation en même temps.

    Voici l'idée avec ce que j'ai fait pour le moment (pitipoisson retrouvera le lien avec l'un de mes récents topics en plus!), à noter que j'ai simplifié/littéralisé au plus la syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    library(doSNOW)
    cl <- makeCluster(4, "SOCK") 
    registerDoSNOW(cl)
    clusterCall(cl, function() library(doSNOW))
    clusterCall(cl, function() library(Reg_log))
    clusterCall(cl, function() library(SVM))
    clusterCall(cl, function() library(Analyse_discrim))
     
    Resultat = 0
    ListeCl <- vector(mode = "list", length = nbCombi) 
    Resultat = foreach(i = nbCombi, .combine = rbind) %dopar%
    { 
          ListeCl[[i]] <- makeCluster(2, "SOCK") 
          registerDoSNOW(ListeCl[[i]])
          clusterCall(ListeCl[[i]], function() library(Reg_log))
          clusterCall(ListeCl[[i]], function() library(SVM))
          clusterCall(cl, function() library(Analyse_discrim))
          Model = foreach(j = 1:3, .combine = c) %dopar%
          {
                 Model = methode_j
           }
           Resultat = Model
    }
    EDIT: pas mal j'ai oublié de mettre mon problème.... bref! En résumé... ça marche pas, il a l'air de traiter correctement pendant un petit moment puis aprés il s'arrête et me met comme erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Erreur dans checkForRemoteErrors(val) : 
      152 nodes produced errors; first error: impossible d'ouvrir la connexion
    Calls: Parallel_ma_fonction ... clusterApplyLB -> dynamicClusterApply -> checkForRemoteErrors
    Je pense qu'il y a une astuce que j'ai zappé... quelqu'un a-t'il déjà eu ce type de manoeuvre à faire et aurait des conseils à me donner?

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur d'études / Biostatisticien
    Inscrit en
    Décembre 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études / Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 354
    Par défaut
    Bon aprés illumination je viens de me rendre compte qu'il suffisait juste de mettre un foreach sans pour autant devoir déclarer de nouveaux cores...

    Autant pour moi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment remplir une matrice aléatoirement ?
    Par Hamza dans le forum Langage
    Réponses: 21
    Dernier message: 08/12/2007, 19h59
  2. remplir une matrice 3D d'images
    Par twix24 dans le forum Images
    Réponses: 1
    Dernier message: 05/12/2007, 20h27
  3. Réponses: 2
    Dernier message: 26/06/2007, 15h40
  4. Remplir une matrice et afficher son contenu
    Par annoussa dans le forum Pascal
    Réponses: 2
    Dernier message: 08/11/2006, 11h48
  5. Remplir une matrice de variance/covariance
    Par ToTo13 dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 31/07/2006, 17h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo