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

Calcul scientifique Python Discussion :

[Numpy] Lenteur produit matriciel


Sujet :

Calcul scientifique Python

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut [Numpy] Lenteur produit matriciel
    Bien le bonjour à tous,

    Je donne un coup de main à un collègue qui fait du calcul scientifique en Python. En profilant son programme dont l'execution est trèèèès longue, je me suis rendu compte que la majeure partie du temps etait consacré au produit de matrice, et non à l'inversion comme je l'aurait supposé. Pour vérifier ca, j'ai créé 2 petits programmes et le résultat est assez surprenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     import numpy as np
     for i in range(1,1000):
             a=np.random.rand(300,300)
             b=np.random.rand(300,300)
             np.dot(a,b)
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     import numpy as np
     for i in range(1,1000):
             a=np.random.rand(300,300)
             b=np.random.rand(300,300)
             np.linalg.inv(a)
    (notez que la generation de b n'est pas necessaire dans le second programme, mais je le laisse pour ne pas pénaliser le premier).

    Resultat sur le premier programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [203] > time python bench1.py
    237.46u 0.08s 3:57.58 99.9%
    et sur le second :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [204] > time python bench2.py
    63.49u 0.05s 1:03.58 99.9%
    Donc le 2e est quasiment 4 fois plus rapide ! Est ce que quelqu'un a une explication à ca ? J'ajoute par ailleurs qu'on travaille sur une grosse becane sur laquelle nous ne sommes pas administrateurs...

    merci !

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Normalement, pour la multiplication matricielle et pour l'inversion, Numpy peut passer par une version optimisée fournie par le système.
    Tu es sous quel OS ? Quelle version de Numpy ? Qu'est ce qui est affiché quand tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from numpy.distutils.system_info import get_info
    print get_info('blas_opt', 0)

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    Salut, merci pour ta réponse.

    Effectivement, le probleme semble venir de ce que BLAS n'est pas installé. Je mets le resultat de ton bout de code en fin de message.

    Le serveur tourne sous Solaris, d'apres l'administrateur pas moyen d'installer BLAS, mais d'apres lui numpy est lié a sun studio qui offre en principe aussi des routines optimisée, mais je ne sais pas comment y acceder.

    J'ai aussi telechargé/compilé BLAS mais je ne pense pas que ca suffise pour l'appeler depuis python.

    Enfin, j'ai compilé BLAS grace a f2py histoire d'en faire directement un module, mais honteusement je dois admettre que je n'arrive pas à utiliser la fonction DGEMM qui semble etre celle qui fait le produit de matrics : http://www.netlib.org/blas/dgemm.f

    Voila donc ou j'en suis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> from numpy.distutils.system_info import get_info 
    >>> print get_info('blas_opt', 0) 
    /usr/lib/python2.4/site-packages/numpy/distutils/system_info.py:1388: UserWarning:  
       Atlas (http://math-atlas.sourceforge.net/) libraries not found.     
    Directories to search for the libraries can be specified in the    
     numpy/distutils/site.cfg file (section [atlas]) or by setting     the ATLAS environment variable. 
      warnings.warn(AtlasNotFoundError.__doc__) /usr/lib/python2.4/site-packages/numpy/distutils/system_info.py:1397: UserWarning:
         Blas (http://www.netlib.org/blas/) libraries not found.     
    Directories to search for the libraries can be specified in the    
     numpy/distutils/site.cfg file (section [blas]) or by setting
        the BLAS environment variable.
      warnings.warn(BlasNotFoundError.__doc__)
     
    {'libraries': [('fblas_src', {'sources': ['./caxpy.f', './csscal.f', './dnrm2.f', './dzasum.f', './saxpy.f', './srotg.f', './zdotc.f', './ccopy.f', './cswap.f', './drot.f', './dznrm2.f', './scasum.f', './srotm.f', './zdotu.f', './cdotc.f', './dasum.f', './drotg.f', './icamax.f', './scnrm2.f', './srotmg.f', './zdrot.f', './cdotu.f', './daxpy.f', './drotm.f', './idamax.f', './scopy.f', './sscal.f', './zdscal.f', './crotg.f', './dcabs1.f', './drotmg.f', './isamax.f', './sdot.f', './sswap.f', './zrotg.f', './cscal.f', './dcopy.f', './dscal.f', './izamax.f', './snrm2.f', './zaxpy.f', './zscal.f', './csrot.f', './ddot.f', './dswap.f', './sasum.f', './srot.f', './zcopy.f', './zswap.f', './scabs1.f', './cgbmv.f', './chpmv.f', './ctrsv.f', './dsymv.f', './dtrsv.f', './sspr2.f', './strmv.f', './zhemv.f', './ztpmv.f', './cgemv.f', './chpr.f', './dgbmv.f', './dsyr.f', './lsame.f', './ssymv.f', './strsv.f', './zher.f', './ztpsv.f', './cgerc.f', './chpr2.f', './dgemv.f', './dsyr2.f', './sgbmv.f', './ssyr.f', './xerbla.f', './zher2.f', './ztrmv.f', './cgeru.f', './ctbmv.f', './dger.f', './dtbmv.f', './sgemv.f', './ssyr2.f', './zgbmv.f', './zhpmv.f', './ztrsv.f', './chbmv.f', './ctbsv.f', './dsbmv.f', './dtbsv.f', './sger.f', './stbmv.f', './zgemv.f', './zhpr.f', './chemv.f', './ctpmv.f', './dspmv.f', './dtpmv.f', './ssbmv.f', './stbsv.f', './zgerc.f', './zhpr2.f', './cher.f', './ctpsv.f', './dspr.f', './dtpsv.f', './sspmv.f', './stpmv.f', './zgeru.f', './ztbmv.f', './cher2.f', './ctrmv.f', './dspr2.f', './dtrmv.f', './sspr.f', './stpsv.f', './zhbmv.f', './ztbsv.f', './cgemm.f', './csymm.f', './ctrsm.f', './dsyrk.f', './sgemm.f', './strmm.f', './zhemm.f', './zsyr2k.f', './chemm.f', './csyr2k.f', './dgemm.f', './dtrmm.f', './ssymm.f', './strsm.f', './zher2k.f', './zsyrk.f', './cher2k.f', './csyrk.f', './dsymm.f', './dtrsm.f', './ssyr2k.f', './zherk.f', './ztrmm.f', './cherk.f', './ctrmm.f', './dsyr2k.f', './ssyrk.f', './zgemm.f', './zsymm.f', './ztrsm.f'], 'language': 'f77'})], 'define_macros': [('NO_ATLAS_INFO', 1)]}
    (c'est bizzare d'ailleurs on dirait qu'il cherche les fichier fortran et pas une librairie. Or ceux ci sont presents sur le serveur, et j'ai bien fait un

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Les fichiers sont peut-être dus au fait que Numpy propose une mini version BLAS, mais elle n'est pas optimisée. Tu peux en revanche installer en local une version de Numpy à jour et optimisée avec les bibliothèques proposées par SUN.

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    Les fichiers sont present parce que je les ai telechargés, mais numpy n'a pas été compilé en les prenant en compte.

    Pour ce qui est de la version avec les trucs de Sun, en principe c'est deja le cas, mais je ne sais pas s'il faut une manip speciale pour les utiliser.

    Enfin pour la compilation en locale de numpy, j'avais essayé, un simple python setup.py -install dans le dossier de numpy. Apparemment il n'a pas créé la libraire _dotblas.a alors que j'avais au prealable compilé BLAS et exporté le chemin vers la librairie correspondante. Est ce qu'il faut compiler autre chose que BLAS avant de compiler numpy, genre lapack ou atlas ? je m'y perds un peu dans tout ca...

    Merci pour tes conseils en tous cas.

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    S'il n'a pas créé _dotblas, c'est bon signe !

    Normalement, il devrait trouver ATLAS, le plus simple est de regarder python setup.py config ou la comamnde que je t'ai donnée.
    Pour le support de SUN, c'est un peu différent à faire, mais ça peut se faire si tu as toujours des problèmes de vitesse.

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    Pourquoi c'est bon signe ?

    En fait c'est sur un autre serveur que j'avais tenté la compilation. Sur le Solaris j'avais une erreur, que je n'ai plus apres avoir tripatouillé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RuntimeError: Broken toolchain: cannot link a simple C program
    Pas plus de _dotblas, mais au debut j'ai bien :

    FOUND:
    libraries = ['fblas']
    library_dirs = ['/home/moi/BLAS']
    language = f77

    FOUND:
    libraries = ['fblas']
    library_dirs = ['/home/moi/BLAS']
    define_macros = [('NO_ATLAS_INFO', 1)]
    language = f77
    par contre il rale pour Atlas et Lapack, je ne sais pas si c'est ennuyeux. je vais faire un test, par contre j'avoue ne pas savoir comment lui dire d'utiliser cette version de numpy plutot que celle deja installé ?

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Il est nécessaire d'avoir en plus lapack. ATLAS est facultatif car il remplace des fonctions de BLAS par ses propres versions optimisées pour ta machine.

    Pour utiliser la tienne qui a été installée par
    python setup.py install --prefix=/quelque/part

    Il suffit d'ajouter (en bash)
    export PYTHONPATH=/quelque/part/lib/python2.?/site-packages/$PYTHONPATH

    En remplaçant ? par la version mineure de ton Python.

Discussions similaires

  1. fonction Produit Matriciel non booleen
    Par roman.nedellec dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/11/2007, 10h35
  2. Réponses: 268
    Dernier message: 07/11/2007, 11h11
  3. [Débutant] Difficulté avec un produit matriciel
    Par david_Montreal dans le forum MATLAB
    Réponses: 6
    Dernier message: 13/07/2007, 22h06
  4. Produit matriciel booléen en VB pour Excel
    Par v4np13 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/11/2006, 12h39
  5. Problème: produit matriciel
    Par v4np13 dans le forum Algorithmes et structures de données
    Réponses: 19
    Dernier message: 17/05/2005, 17h23

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