Bonjour,
Je suis tombé sur un problème un peu inattendu. J'ai voulu modifier une de mes versions d'un algorithme de gradient stochastique pour de l'optimisation sous incertitudes en lui ajoutant la possibilité de travailler avec des variables aléatoires à densité de probabilité "customisée" par l'utilisateur. Pour pouvoir faire des tirages aléatoires de ces variables custom, je crée des rv_continuous (de la lib. scipy.stats) à densité imposée ou à fonction de répartition imposée par l'utilisateur, puis j'utilise l'inverse de la fonction de répartition pour effectuer les tirages pseudo aléatoire via l'utilisation de VA uniformes entre [0,1].

À partir de plusieurs points de départs différents dans l'espace des variables d'optimisation, on utilise une méthode de gradient stochastique sur chacun des points et tout ça en parallèle (chaque optimisation de point de départ différent étant indépendant l'un de l'autre). Le problème est que les variables aléatoires créées par la lib. scipy.stats ne sont pas des objet "pickeable" ce qui ne permet pas à mon multiprocessing.map de fonctionner ensuite.

Je suis pas le roi du python, et j'ai donc un peu de mal avec la notion de "pickle" qui colle au multiprocessing. Voilà un exemple simple de code qui ne fonctionne pas en multiproc avec la lib scipy.stats
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
RV  = scipy.stats.norm(loc = 0, scale = .3);
 
def Tir(rv,N):
<div style="margin-left:40px">return rv.ppf(np.random.random(N))</div>
 
pTir = partial(Tir,RV);
pooool = mp.pool(Processes = 2)
pooool.map(pTir,range(1,5));
et en faisant ça on obtient l'erreur suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
Donc peut être qu'une autre voix est possible pour la création de variables aléatoires à pdf custom, et qui donne un objet pickleable pour le multiprocessing de python. J'ai vu que certains utilisent un autre algorithme de serialisation (dill) et utilisent pathos comme libraire de multiprocessing. Cependant pathos n'est pas une librairie de "base", et je vais en prendre pour 2 mois d'attente au travail si je demande l'installation de cette librairie sans être sûr du résultat.
Voilà, si vous avez des idées pour me débloquer c'est génial !

À bientôt,
GavrocheDesBois