Julia programmation parallèle-mettre la fonction existante à la disposition de tous les travailleurs
je suis confronté au problème suivant:
j'ai une fonction appelée TrainModel qui court très longtemps sur un seul fil. Quand il termine le calcul, il renvoie une fonction comme argument de sortie, appelons-la f. Quand j'ai renseigner le type de cette f, Julia retourne:
(fonction générique avec la méthode 1)
(Je ne suis pas sûr que cette dernière information soit utile à quiconque la lecture de cet)
maintenant dans une deuxième étape, je dois appliquer la fonction f sur un très grand tableau de valeurs. C'est une étape que je tiens à paralléliser. Après avoir commencé Julia avec plusieurs processus, par exemple
julia -p 4
idéalement, je voudrais utiliser:
pmap(f, my_values)
ou peut-être:
aux = @parallel (hcat) for ii=1:100000000
f(my_values[ii])
end
Malheureusement, cela ne fonctionne pas. Julia se plaint que les travailleurs ne sont pas au courant de la fonction f, c'est à dire-je obtenir un message vocal:
erreur: la fonction f n'est pas définie sur le processus 2
Comment puis-je faire fonctionner f disponible pour tous les travailleurs? Naturellement, un "sale" solution serait d'exécuter la fonction fastidieuse TrainModel sur tous les ouvriers, comme ceci peut-être:
@everywhere f = TrainModel( ... )
mais ce serait une perte de cpu quand tout ce que je veux, c'est que juste le résultat f est accessible à tous les travailleurs.
bien que j'aie cherché poteaux avec des problèmes semblables, jusqu'ici je n'ai pas pu trouver une réponse...
Merci d'avance! meilleur,
N.
2 réponses
l'approche pour retourner la fonction semble élégante mais malheureusement, contrairement à JavaScript, Julia ne résout pas toutes les variables lors de la création des fonctions. Techniquement, votre fonction de formation pourrait produire le code source de la fonction avec des valeurs littérales pour tous les paramètres formés. Puis le passer à chacun des processus de travail, ce qui peut l'analyser dans leur environnement à une fonction appelable.
je suggère de retourner une structure de données qui contient toutes les informations pour produire la fonction formée: poids D'un ANN, Vecteurs de soutien, règles de décision ... Définir une fonction "formée" sur les processus du travailleur, de sorte qu'elle utilise les paramètres formés. Vous pourriez vouloir avoir la possibilité de sauvegarder les résultats de la formation sur le disque de toute façon, de sorte que vous pouvez facilement reproduire vos calculs.
Il existe une solution Unix uniquement basée sur les PTools.jl paquet (https://github.com/amitmurthy/PTools.jl).
il s'appuie sur le parallélisme via la bifurcation au lieu du mécanisme Julia in-built. Les processus fourchés sont générés avec le même espace de travail que le processus principal, de sorte que toutes les fonctions et variables sont directement disponibles pour les travailleurs.
ceci est similaire aux groupes de fourches dans le paquet parallèle R, donc il peut être utilisé comme mclapply fonction.
la fonction d'intérêt est pfork (n::entier, f::fonction, args...) et une différence notable avec mclapply dans R, la fonction f doit prendre comme premier argument de l'indice du travailleur.
Un exemple:
Pkg.add("PTools")
Pkg.checkout("PTools") #to get the last version, else the package does not build at the time of writing
using PTools
f(workid,x) = x[workid] + 1
pfork(3, f, [1,2,3,4,5]) #Only the three first elements of the array will be computed
3-element Array{Any,1}:
2
3
4
j'attends qu'une interface pour pfork sera construit de telle sorte que le premier argument de la fonction ne doit pas être l'indice de l'ouvrier, mais pour le moment, il peut être utilisé pour résoudre le problème