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

Python Discussion :

Problème de soumission d'un job en parallèle sur qsub


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 5
    Par défaut Problème de soumission d'un job en parallèle sur qsub
    Bonjour,

    Je ne sais pas vraiment où poster cette question. J'ai cherché mais n'ai pas vraiment trouvé de place adaptée donc désolé si ce fil de discussion n'est pas au bon endroit

    Je vais vous exposer mon problème. J'ai un job en parallèle à soumettre à un centre de calcul (un code en fortran parallélisé avec du openMPI).
    Or pour le lancer le code en fortran, je lance un script python qui étudie un fichier (de maillage) et écrit dans un autre fichier les résultats de qu'il lit (python.res). Puis ce script python lance le code fortran en parallèle à la toute fin du script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    import os 
    ....
     
    os.system("mpirun -np {0} exe".format(nbSsDomains+1))
    où nbSsDomains a été crée par python à la lecture du premier fichier (celui de maillage).
    Jusqu'ici tout se passe bien.
    Mais lorsque les jobs se lancent en parallèle ils disent tous qu'il manque le fichier "python.res". En fait ce qu'il se passe (en tout cas j'ai l'impression) c'est que la dernière ligne du code python est lancée avant que python ne crée le fichier python.res. Pire encore, d'après mes tests, j'ai l'impression que le processeur qui gère ce script Python attend que tous les autres proc aient fini leur travail avant d'écrire quoi que ce soit. En effet je fais un "print" dans le script python et il ne s'affiche qu'après la fin du code fortran.

    Pour l'instant je suis donc obligé de m'assurer de bien crée le fichier python.res avant de lancer le job sur le serveur de calcul.
    Des idées pour s'affranchir de ceci ou bien du pourquoi du comment ?

    Voilà, j'espère avoir été clair. Et merci de votre aide !

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Si le fichier créé par Python est volumineux, il est parfois nécessaire de forcer l'écriture avec flush().

    Toutefois, les disques durs utilisent, eux aussi, un tampon et on ne peut les forcer à aller plus vite, dans ce cas on fait une temporisation.

    Cependant, tu dis que le fichier n'existe pas, or python crée le fichier dès l'ouverture en écriture donc c'est que ta commande mpirun est envoyée trop tôt.

    Il semble que la structure de ton code soit en cause.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 5
    Par défaut
    Bonjour,

    Merci pour ta réponse matinale VinsS. Le fichier crée par python n'est pas volumineux (une centaine d'octets tout au plus) donc ce n'est pas ça le problème.
    Je peux te montrer mon code python si tu veux. Mais je fais la commande mpirun à la toute fin. C'est peut être une histoire (qui me dépasse) de gestion de processeurs car je demande 21 proc sur mon mpirun mais je me demande qui gère le script python pour justement réaliser cette commande mpirun.

    Bonne journée !

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Ben oui, faudra montrer le code.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 5
    Par défaut
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    # -*-coding:utf-8 -*
     
    import os
    import sys
    import numpy
     
     
    if len(sys.argv) > 1:
        filename = sys.argv[1]
     
    else:
     
        filename = raw_input("Entrer le nom du fichier mesh \n")
     
        # Si jamais filename n'est pas specifie on lui donne testpart.msh
        # Valeur par defaut pour gagner du temps sur les tests
        if filename  == "":
            filename = "testpart.msh"
     
     
     
     
    # Test de l'existence du fichier de maillage
    try:
        with open(filename): pass
    except IOError:
        print "*************************************************************"
        print "      ERREUR : le fichier spécifié n'existe pas              "
        print "*************************************************************"
        sys.exit(1)
     
     
     
    file = open(filename, "r")
     
    while 1:
        f = file.readline()
        if list(f) == ['$', 'E', 'l', 'e', 'm', 'e', 'n', 't', 's', '\n']:
            break
     
    size = int(file.readline())
    A = numpy.zeros(shape=(size,1))
     
    for i in range(size):
        f = file.readline()
        f = numpy.fromstring(f, dtype=int, sep=' ')
        A[i] = f[6]
     
    nbSsDomains = int(numpy.amax(A))
    print "*************************************************************"
    print "**                 INFOS PYTHON                              "
    print "**  Le fichier lu est : ", filename
    print "**  Le nombre de sous-domaines est :", nbSsDomains
    print "**  Ce nombre est stocké dans le fichier : " "python_res.txt"
    print "*************************************************************"
    print
    print
    print
     
    # Ecriture dans le fichier résultat lu par le code fortran
    resultats = open("python_res.txt", "w")
    resultats.write(filename)
    resultats.write('\n')
    resultats.write(str(nbSsDomains))
     
     
    resultats.close()
     
    file.close()
     
    # Lancer le programme : mpirun -np nbSsDomains+1 exe
    os.system("mpirun -np {0} exe".format(nbSsDomains+1))

    Voici
    Merci beaucoup.

  6. #6
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Comment ton code fortran a connaissance de l'emplacement du fichier "python_res.txt"

    Avec ton code, le fichier est créé dans le dossier courant, celui où se trouve le script python.

    Si tu confirmes que le fichier "python_res.txt" est bien créé alors le problème est peut-être son emplacement.

  7. #7
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Mouais, par curiosité j'ai fais une recherche sur mpirun et ceci en est le man:
    https://www.open-mpi.org/doc/v1.8/man1/mpirun.1.php

    Si c'est la commande expliquée dans le paragraphe Quick Summary que tu veux lancer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mpirun [ -np X ] [ --hostfile <filename> ] <program>
    il est question d'un nom de fichier et d'un nom de programme.

    Dans ton code le nom du programme semble être exe, est-ce vraiment son nom ?

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 776
    Par défaut
    Salut,

    Mettez en commentaire la ligne 93 de votre programme: "os.system("mpirun -np {0} exe".format(nbSsDomains+1))" et lancez l'exécutable "à la console" directement.
    Si çà ne fonctionne pas mieux, vous pouvez vérifier que le fichier a bien été créé (par Python), qu'il contient ce qui est attendu et que le soucis est dans le code fortran.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 5
    Par défaut
    Alors pour répondre dans l'ordre :

    @ VinsS :

    En fait y'a une petite modification sur le code par rapport à celui envoyé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    resultats = open("/home/a11gr6/parallelisation/python_res.txt", "w")
    resultats.write(filename)
    resultats.write('\n')
    resultats.write(str(nbSsDomains))
    Le code fortran à connaissance de l'emplacement car le script Python enregistre le fichier python_res.txt avec le chemin absolu et donc pour le code forrtan je reprends ce chemin absolu.

    L'exécutable est bien l'exe. Le problème majeur ne vient pas du script Python. En fait je suis sur un centre de calcul et donc je me connecte sur la frontale. Si je lance le programme sur la frontale tout se passe bien. Si je lance le job avec qsub c'est là qu'il y a un problème. Le fichier "python.res" est bien crée mais j'ai l'impresison qu'il est crée après que les processeurs exécutant le code en fortran veulent le lire.
    En effet je fais des write(*.*) un peu partout dans le code fortran. Et dans le fichier final crée, ces write du code fortran sont avant dans le fichier texte par rapport au "print" du code python (pour le job sur le centre de calcul, tout ce qui doit normalement s'afficher dans le terminal est stocké dans un fichier d'extension .o).

    Pour être encore plus précis, le job marche très bien lorsque le fichier "python.res" est préexistant.


    @wiztricks :

    Je crois que mes remarques précédentes répondent à cette remarque. Le code fonctionne très bien :

    1) Lorsque je le lance moi-même.
    2) Lorsque je le lance via le script python sans le soumettre au centre de calcul par qsub.
    3) Lorsque je le soumets au centre de calcul par qsub et que mon fichier "python.res" est préexistant.



    EDIT : je viens de trouver mon erreur. Il venait du code fortran en fait. Le fait d'ajouter "/" dans le nom du fichier à lire (chose que je ne faisais pas pour la lecture en directe), trouble forrtan et un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    read(n° du fichier,*)
    ne suffit plus ,il faut plutôt écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    read(n° du fichier, '(a1024)')
    (1024 par exemple) pour lui préciser de lire ça en temps que chaîne de caractère.

    Et ce problème était cumulé à une erreur de chemin comme l'a fait remarqué VinsS


    Merci beaucoup à tous les deux !

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

Discussions similaires

  1. Problème avec soumission de Job
    Par ambre dans le forum PL/SQL
    Réponses: 6
    Dernier message: 18/07/2008, 12h52
  2. Plug-Board : problème de soumission
    Par Vlatiska dans le forum ASP.NET
    Réponses: 5
    Dernier message: 19/05/2008, 10h18
  3. Réponses: 3
    Dernier message: 18/02/2008, 11h56
  4. problème de soumission
    Par Llaur76 dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 02/08/2007, 17h22
  5. Problème d'exécution d'un job Oracle
    Par KuBi4K dans le forum SQL
    Réponses: 3
    Dernier message: 01/06/2007, 09h47

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