Fonction gee, problème d'arrêt de la fonction.

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Jules Pereira
Messages : 3
Enregistré le : 09 Fév 2023, 15:30

Fonction gee, problème d'arrêt de la fonction.

Messagepar Jules Pereira » 16 Fév 2023, 14:01

Bonjour,

J'aimerai être éclairé sur un problème qui m'est arrivé depuis peu sur la fonction "gee" du package gee .

Faisant une étude de simulation sur des données binaires corrélées, j'utilise la fonction gee, et pour certains jeux de données, la fonction gee tourne indéfiniment sans converger. Je suis obliger de forcer l'arrêt de la console sur Rstudio, sinon cela ne s'arrête jamais.

J'ai essayer d'implémenter la fonction "withTimeout", du package R.utils, afin de stopper la fonction à partir d'un certain temps mais cela ne fonctionne pas non plus.

En regardant la fonction gee, sur github (https://github.com/cran/gee/tree/master/R), j'ai cru comprendre que la fonction "gee" était codé en C, langage que je ne maitrise pas très bien... Et il n'est pas possible pour moi de directement modifié le code de la fonction afin de forcer l'arrêt de la fonction.
J'aimerai savoir si quelqu'un(e) a déjà rencontrer ce problème , et si oui, aurait des idées de comment résoudre ce problème ?

Merci d'avance de votre aide,

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Fonction gee, problème d'arrêt de la fonction.

Messagepar Logez Maxime » 16 Fév 2023, 14:53

Bonjour,

Quelle est la taille de tes jeux de données qui posent problème et combien de temps as-tu laissé tourner tes modèles ?
Je ne connaissais pas withTimeout, mais j'ai essayé avec un gee (sur un temps court) et ça à fonctionner.

Si ça ne fonctionne pas dans la console, tu peux peut-être essayer de lancer ton code en mode batch et de définir un temps maximum de calcul.

Cordialement,
Maxime

Jules Pereira
Messages : 3
Enregistré le : 09 Fév 2023, 15:30

Re: Fonction gee, problème d'arrêt de la fonction.

Messagepar Jules Pereira » 17 Fév 2023, 13:13

Logez Maxime a écrit :Bonjour,

Quelle est la taille de tes jeux de données qui posent problème et combien de temps as-tu laissé tourner tes modèles ?
Je ne connaissais pas withTimeout, mais j'ai essayé avec un gee (sur un temps court) et ça à fonctionner.

Si ça ne fonctionne pas dans la console, tu peux peut-être essayer de lancer ton code en mode batch et de définir un temps maximum de calcul.

Cordialement,
Maxime


Bonjour Maxime,

Merci tout d'abord pour ta réponse.

La taille de mes jeux données sont variables, pour être plus précis, je fais une étude de simulation, contenant 135 scénarii et dont je fais 1000 itérations par scénario.
Pour mes 1000 itérations, j'utilise le parallélisme afin d'analyser mes 1000 jeux de données par scénario. Sur certains scénarii, une analyse en utilisant la fonction gee peut mettre moins d'une seconde comme être "infini", j'ai déjà laissé tourner mon modèle plus de deux jours alors que pour un jeu de données simulé avec les mêmes paramètres le modèle se terminait en 2 secondes.

Le batch pourrait être une solution effectivement même si je ne m'y connait pas très bien à ce sujet, je vais essayer de me renseigner. Car j'utilise du batch pour lancer mon étude de simulation, mais cela ne résout pas entièrement mon problème, car pour donner un exemple :

Je prends un scenario, qui pour 1000 jeux de données va donc faire 1000 analyses. Je fais ces analyses en parallélisation, en utilisant 8 coeurs (par exemple), disons qu'à un moment les 8 tâches rencontrent ce problème de temps infini pour mon modèle gee, mon script batch va arrêter tout cela mais je n'aurai pas mes 1000 analyses. Mon idée de base, était d'automatiser l'arrêt de la fonction gee en fonction du temps afin de quand même analyser les itérations restantes, sans à avoir à interrompre mon programme.

Mais ce que j'ai du mal à comprendre c'est que pour un même scénario, on peut utiliser la fonction withTimeout si de base je ne rencontre aucun soucis avec mon modèle pour un certain jeu de données mais elle ne fonctionne pas pour certains jeux de données qui font tourner mon modèle sans jamais l'arrêter.

Je ne sais pas si je peux faire suivre un Script R avec un jeu de donnée sur le forum afin de montrer mon problème de façon plus explicite.

Encore merci pour ta réponse,
Jules

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Fonction gee, problème d'arrêt de la fonction.

Messagepar Logez Maxime » 17 Fév 2023, 14:49

re,

Je n'ai pas vraiment d'explication, mais dans un cas comme celui-là soit tu tombes sur des scénarios borderline qui font bugger la fonction gee, soit la fonction gee ne permet pas la parallélisation correctement. J'avais eu le cas d'une fonction codée en c qui n'était pas faite pour être lancer en parallèle et qui cassait le cluster.

Tu peux effectivement lancer ton modèle en batch, ce qui aura pour avantage d'ouvrir une deuxième session. Dans cette deuxième session tu fais tourner le modèle, tu exportes les résultats du modèle dans un objet qui convient, par exemple text si ce ne sont que les coefficients qui t'intéressent ou alors un objet .Rdata si tu veux tout le modèle.
Dans la session qui a lancé le bacth, tu te mets un timer, par exemple 2 secondes. Ensuite tu vérifies si l'objet de sortie a été créé. Si oui tu importes les résultats, si non tu fais fermer la deuxième session et tu en relances une nouvelle jusqu'à avoir ton résultat.
C'est vraiment du bidouillage mais ça devrait fonctionner.

Code : Tout sélectionner

# dans ta première session :
# 1. tu crées le fichier .R qui va contenir les instructions à lancer dans ta 2ème session
# 1.1 tu exporteras l'id de la 2ème session pour le récupérer. Ca servira pour le killer par la suite si besoin est.
writeLines("writeLines(as.character(Sys.getpid()), con = sprintf('%s/pid_%d.txt', getwd(), 1))", con = sprintf("test_%d.R", 1))
# 1.2 les lignes de commande, ici une ligne qui prend du temps pour tester si ça fonctionne
write("res <- replicate(1e3, mean(rnorm(1e6)))", file = sprintf("test_%d.R", 1), append = TRUE)
# 1.3 l'export du résultat
write("save(res, file = sprintf('res_%d.Rdata', 1))", file = sprintf("test_%d.R", 1), append = TRUE)

# 2. tu fais executer les commandes des fichiers test_x.R en batch en arrière plan (wait = F)
system(sprintf("R CMD BATCH test_%d.R", 1), wait = FALSE)

# 3. tu vérifies si le fichier de sortie est dispo sinon tu killes la deuxième session
Sys.sleep(3)
if (!file.exists(sprintf("res_%d.Rdata", 1)))
  system(sprintf("tskill %d", scan(sprintf("pid_%d.txt", 1), integer())))

C'est le début, il reste à tout coder dans les fichiers R, il reste aussi à faire une boucle while qui inclurait le Sys.sleep et les commandes pour relancer le modèle au besoin.

Cordialement,
Maxime

Jules Pereira
Messages : 3
Enregistré le : 09 Fév 2023, 15:30

Re: Fonction gee, problème d'arrêt de la fonction.

Messagepar Jules Pereira » 22 Fév 2023, 12:01

Logez Maxime a écrit :re,

Je n'ai pas vraiment d'explication, mais dans un cas comme celui-là soit tu tombes sur des scénarios borderline qui font bugger la fonction gee, soit la fonction gee ne permet pas la parallélisation correctement. J'avais eu le cas d'une fonction codée en c qui n'était pas faite pour être lancer en parallèle et qui cassait le cluster.

Tu peux effectivement lancer ton modèle en batch, ce qui aura pour avantage d'ouvrir une deuxième session. Dans cette deuxième session tu fais tourner le modèle, tu exportes les résultats du modèle dans un objet qui convient, par exemple text si ce ne sont que les coefficients qui t'intéressent ou alors un objet .Rdata si tu veux tout le modèle.
Dans la session qui a lancé le bacth, tu te mets un timer, par exemple 2 secondes. Ensuite tu vérifies si l'objet de sortie a été créé. Si oui tu importes les résultats, si non tu fais fermer la deuxième session et tu en relances une nouvelle jusqu'à avoir ton résultat.
C'est vraiment du bidouillage mais ça devrait fonctionner.

Code : Tout sélectionner

# dans ta première session :
# 1. tu crées le fichier .R qui va contenir les instructions à lancer dans ta 2ème session
# 1.1 tu exporteras l'id de la 2ème session pour le récupérer. Ca servira pour le killer par la suite si besoin est.
writeLines("writeLines(as.character(Sys.getpid()), con = sprintf('%s/pid_%d.txt', getwd(), 1))", con = sprintf("test_%d.R", 1))
# 1.2 les lignes de commande, ici une ligne qui prend du temps pour tester si ça fonctionne
write("res <- replicate(1e3, mean(rnorm(1e6)))", file = sprintf("test_%d.R", 1), append = TRUE)
# 1.3 l'export du résultat
write("save(res, file = sprintf('res_%d.Rdata', 1))", file = sprintf("test_%d.R", 1), append = TRUE)

# 2. tu fais executer les commandes des fichiers test_x.R en batch en arrière plan (wait = F)
system(sprintf("R CMD BATCH test_%d.R", 1), wait = FALSE)

# 3. tu vérifies si le fichier de sortie est dispo sinon tu killes la deuxième session
Sys.sleep(3)
if (!file.exists(sprintf("res_%d.Rdata", 1)))
  system(sprintf("tskill %d", scan(sprintf("pid_%d.txt", 1), integer())))

C'est le début, il reste à tout coder dans les fichiers R, il reste aussi à faire une boucle while qui inclurait le Sys.sleep et les commandes pour relancer le modèle au besoin.

Cordialement,
Maxime



Bonjour Maxime,

Ta solution m'a bien aidé. J'ai maintenant ce qu'il me faut grâce à ton code en l'ayant modifié pour l'adapter bien sûr mais ça fonctionne très bien !
Merci encore !

Jules


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron