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 :

doParallel creation d'un fichier: impossible d'ouvrir la connexion


Sujet :

R

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut doParallel creation d'un fichier: impossible d'ouvrir la connexion
    Bonjour,

    J'essaye d'utiliser la bibliothèque doParallel mais j'obtiens une erreur, apparemment ça viendrait du fait que je crée un fichier dans la boucle mais je ne sais pas comment résoudre ce problème.

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    library(doParallel)
     
    outDir <- paste0("outDir")
    dir.create(outDir)
     
    ncores <- 2
    cl <- makeCluster(ncores)
    registerDoParallel(cl)
     
    method <- c("svmLinear")
    tuneGrid <- list(expand.grid(C=5))
    res <- as.data.frame(matrix(data = rnorm(20),nrow = 10, ncol = 2))
    res$act <- c(1:10)
    foreach(i=1:length(method), .packages=c('caret')) %dopar%
    {
      t1 <- Sys.time(); 
     # Entraînement
      model <- caret::train(act ~.,data = res,
                            method=method[i],
                            trControl = trainControl(method = "cv", number=10,savePredictions=T),
                            tuneGrid=tuneGrid[[i]])
      t2 <- Sys.time()
      # Création du fichier
      conn <- file( sprintf(outDir,"/", method[i],".txt") , open = "a" )
      l <- list("method" = model$method, "results" = model$results[1:3],
                "cross-validation" = model$control$method, "temps" = difftime(t2, t1))
      # Écriture
      write.table(l, conn , append = TRUE , col.names = T )
      # Fermeture du fichier
      close(conn)
     
    } 
     
    stopCluster(cl)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error in { : task 1 failed - "impossible d'ouvrir la connexion"

  2. #2
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    Bonjour,

    Tu ne peux pas accéder à un même fichier en parallèle sans que ça pose problème.
    Pour chaque coeur il te faut écrire dans un fichier différent sans quoi tu auras toujours ce problème, ce qui ne semble pas être le cas ici parce que le nom de ton fichier dépend de la méthode.
    Par contre la fonction sprintf ne fonctionne pas comme ça. Si tu veux concaténer des chaînes de caractères alors paste0 est surement mieux indiquée que ?sprintf.

    Par contre il doit y avoir un autre souci parce que tu fais appel au vecteur "methode" dans le calcul parallèle mais tu n'as pas exporté cet objet dans chaque cœur. Si ton cluster est de type "fork" (mémoire partagée) ça va fonctionner mais s'il est de type "sock" ou "psock" (mémoire dédiée) ça ne marchera pas. Pareil pour tous les objets dont tu as besoin ("outdir", "res", "tuneGrid", etc.). Il te faut les exporter (si cluster en mémoire dédiée) avec la fonction clusterExport(cl, c("outdir", "res", "methode", "tuneGrid", ...)). Après tu cherches a exporter une liste avec la fonction write.table et je ne suis pas sur que ça fonctionne non plus. Il te faut plutôt utiliser la fonction save pour sauvegarder ton objet dans un Rdata.

    J'imagine que ton code est un exemple parce qu'ici tu ne testes qu'une méthode sur un coeur donc ça va être plus long que si tu le faisais normalement en séquentiel.

    cdlt

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut
    Bonjour,

    Oui j'ai adapté pour un exemple, j'ai modifié le code

    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
    25
    26
    27
    28
    29
    30
    31
    32
     
    library("caret")
    library("doParallel")
     
    ncores <- 2
    cl <- makeCluster(ncores)
    registerDoParallel(cl)
     
    method <- c("svmLinear")
    tuneGrid <- list(expand.grid(C=5))
    res <- as.data.frame(matrix(data = rnorm(20),nrow = 10, ncol = 2))
    res$act <- c(1:10)
     
    clusterExport(cl, c("res", "method", "tuneGrid"))
    result <- foreach(i=1:length(method), .packages=c('caret')) %dopar%
    {
      t1 <- Sys.time(); 
      model <- caret::train(act ~.,data = res,
                           method=method[i],
                           trControl = trainControl(method = "cv", number=10,savePredictions=T),
                           tuneGrid=tuneGrid[[i]])
      t2 <- Sys.time()
      save.path <- paste0("model~", method[i])
      saveRDS(model, file = paste(save.path, sep = "/"))
      list("method" = model$method, "results" = model$results[1:3],
           "cross-validation" = model$control$method, "temps" = difftime(t2, t1))
     
    }  # <- l'erreur apparait à ce niveau là
     
    write.table(result, file ="results.txt")
     
    stopCluster(cl)
    j'obtiens une autre erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Error in { : task 1 failed - "Required package is missing"
    Calls: %dopar% -> <Anonymous>
    Execution halted
    Y a que le package caret que j'utilise dans la boucle foreach, je ne comprends pas.

  4. #4
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    re,

    j'ai testé ton code et chez moi il fonctionne. Est-ce que tu as essayé de relancer ta session par exemple ?

    cdlt

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut
    Bonjour,

    J'utilise mon code sur un petit calculateur avec le gestionnaire SLURM. Dans le code j'ai rajouter un try catch et un on.exit sur la fonction stopCluster(), je n'ai plus de message d'erreur mais il n'y a rien qui s'écrit le fichier result, il se crée mais il est vide et il n'y a pas de fichier rds qui se crée aussi .



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ...
    result <- tryCatch({foreach(i=1:length(method), .packages=c('caret')) %dopar%
    {
    ...
    }
    }, error = function(e) {
         on.exit(stopCluster(cl))
    })
    
    ...
    
    on.exit(stopCluster(cl))

  6. #6
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    re,

    dans la fonction de creation de ton cluster tu devrais mettre aussi l'argument outfile = "nom_fichier.txt" pour voir ce que t'on cluster renvoie au juste.
    J'ai des doutes sur la fonction de création de ton chemin pour l'export de tes résultats save.path <- paste0("model~", method[i]) ça ne ressemble pas a un chemin valide ?
    sinon tu peux aussi faire tourner le code en séquentiel avec %do% a la place de %dopar%.

    cdlt

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut
    Bonjour,

    J'ai rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    outfile = "nom_fichier.txt"
    dans la fonction makeCluster(...), l'erreur contenu dans se fichier me disait qu'il fallait installer un package, je l'ai fait et maintenant tout fonctionne parfaitement.

    Merci de votre aide.

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

Discussions similaires

  1. Erreur:Impossible d'ouvrir une connexion à SQL SERVER
    Par ahbari dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 13/12/2011, 15h36
  2. Réponses: 10
    Dernier message: 07/05/2009, 13h33
  3. impossible d'ouvrir une connexion à la BD
    Par caro_caro dans le forum JDBC
    Réponses: 1
    Dernier message: 10/04/2008, 15h05
  4. Réponses: 0
    Dernier message: 04/03/2008, 16h58
  5. Impossible d'ouvrir une connexion à SQL Server
    Par lamiruth dans le forum Accès aux données
    Réponses: 1
    Dernier message: 18/02/2007, 15h40

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