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 :

Comment "multi-processer" des calculs de gros arrays au mieux ?


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Comment "multi-processer" des calculs de gros arrays au mieux ?
    Bonjour,

    Je développe actuellement mon projet en python 2.7, sur une tour avec près de 100 Go de Ram et 12 coeurs.

    Une des étapes de mon calcul est une multiplication d'array de très grosse taille (512*512*512*512).

    Jusqu'à maintenant, pour des tailles inférieures à celle annoncée au dessus, cela fonctionnait convenablement.
    Pour accélérer les choses, j'ai essayé différentes options de multi processing, comme "pool.async" de la bilbiothèque "multiprocessing", ou encore "joblib".

    Je me suis à chaque fois heurté à un problème, la taille de mes matrices qui dépassent les limites 32 bits de ces deux solutions énoncées juste au dessus.
    Effectivement, je souhaiterai avoir un résultat avec des matrices de 1024.

    Je n'aspire pas à devenir un grand programmeur en python, et n'ai pas particulièrement d’appétence pour trouver des solutions qui demandent de se lancer profondément dans les codes de Python et de ses bibliothèques.

    Ma question est donc la suivante : Quelles sont les solutions les plus "user friendly" disponibles pour effectuer des calculs de grosses matrices en 64 bits ?
    Je connais notamment cette page web : https://wiki.python.org/moin/ParallelProcessing ; mais j'ai beaucoup de mal à faire le tri.

    Merci !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Magea Voir le message
    Ma question est donc la suivante : Quelles sont les solutions les plus "user friendly" disponibles pour effectuer des calculs de grosses matrices en 64 bits ?
    Il faut commencer par utiliser les moutures 64 bits de Python, numpy, ... pour charger en mémoire des objets qui dépassent la capacité d'adressage 32 bits. Avec cela, vous devriez pouvoir fonctionner, l'étape suivante sera d'accélerer les calculs, si nécessaire.

    Il faut découper (logiquement) les traitements pour arriver à les exécuter en parallèle sur l'ensemble des processeurs disponibles via la bibliothèque multiprocessing. Techniquement, on va placer les données en mémoire partagée (shared memory) pour éviter d'avoir à recopier tout ou partie des données d'un espace virtuel à l'autre.

    Le plus difficile est d'arriver à faire le découpage "logique" car il dépend de vos algorithmes.

    Pour le reste, essayer de rechercher "numpy shared memory", il y a plein d'exemples de code pour faire çà. Il faudra les adapter à votre contexte.

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

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Merci de ta réponse.

    J'avais déjà pris l'initiative de travailler avec les versions 64 bits de Numpy, Python ...

    Puisque j'utilisais déjà la bibliothèque "multi processing" avec des composants 64 bits, mais que je rencontrai l'erreur :

    SystemError: NULL result without error in PyObject_Call

    Vous me confirmez quand même qu'il est possible avec "multiprocessing" de gérer mes grosses matrices ? Mais évidemment il faut découper moi même les données comme vous l'avez suggéré au préalable. Il n'y pas de solutions "clefs en main".

    Merci !

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Magea Voir le message
    Puisque j'utilisais déjà la bibliothèque "multi processing" avec des composants 64 bits, mais que je rencontrai l'erreur :

    SystemError: NULL result without error in PyObject_Call
    Ce genre d'erreur s'appelle un bug. Avec un peu de chance, vous n'êtes pas le seul à le rencontrer. Il faut éplucher les "bug reports" pour voir lesquels s'appliquent à votre cas et espérer que les solutions proposées (si elles existent) s'appliqueront à votre cas.

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

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    J'ai précisément épluché les bugs report.

    Les réponses expliquaient que "multi processing" ne prenait pas en charge nativement les array de plus de 32 bits.
    Et que si je voulais faire des calculs plus volumineux, je devais modifier des fichiers "profonds" de python et de ses bibliothèques pour le faire, ce dans quoi je n'ai pas envie de me lancer.

    Mais étant assez pragmatique, et me disant que je ne devais évidemment pas être la première personne en 2015 à faire du gros calcul matriciel sur Python, il devait sûrement exister des solutions plus "user friendly" que j'avais peut être du mal à trouver.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Magea Voir le message
    Mais étant assez pragmatique, et me disant que je ne devais évidemment pas être la première personne en 2015 à faire du gros calcul matriciel sur Python, il devait sûrement exister des solutions plus "user friendly" que j'avais peut être du mal à trouver.
    Le soucis est dans la réalisation de la "shared memory". Normalement, numpy.memmap est fait pour (mais je n'ai pas testé car à l'époque, j'ai du utiliser une solution plus rustique passant par une extension "C" qui ressemble à sharedmem).

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

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Sinon il y a numexpr qui est capable d'exploiter le multi-threading.

    Mais un array de taille 512*512*512*512, ça fait 236 éléments, ça ne tient même pas en mémoire avec 100 GB si chaque élément fait plus d'un octet, donc il faudra quand-même segmenter le calcul...

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/03/2007, 10h08
  2. Réponses: 8
    Dernier message: 18/09/2002, 03h20

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