Параллельная обработка в Юлии - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь запустить цикл for параллельно, который включает в себя попытку модели eras параллельно. Ниже приведен код:

function init_population(pop :: _population)
        addprocs(16)

    @sync @parallel for i in 1:pop.size
    @everywhere ran=sample(1:202,10,replace=false)
    @everywhere w=get_weights(ran)  ####keras model
    @everywhere gg=_genotype(ran,w)   ### composite type
    @everywhere m,v=get_mean_variance(gg)  ####func doing calculation
    @everywhere pp=_phenotype(m,v)    ### composite type
    @everywhere fitn=get_fitness(pp)   ####func doing calculation
    @everywhere new_guy = _individual(gg,pp,fitn)     ### composite type
    @everywhere push!(pop.individuals, new_guy)
end
return pop
end

Ошибка, которую я получаю ::

ERROR: LoadError: UndefVarError: sample not defined
eval at ./boot.jl:235
eval_ew_expr at ./distributed/macros.jl:116 [inlined]
#135 at ./distributed/remotecall.jl:319
run_work_thunk at ./distributed/process_messages.jl:56
#remotecall_fetch#140 at ./distributed/remotecall.jl:344
remotecall_fetch at ./distributed/remotecall.jl:344
#remotecall_fetch#144 at ./distributed/remotecall.jl:372
remotecall_fetch at ./distributed/remotecall.jl:372
#33 at ./distributed/macros.jl:102
#remotecall_fetch#140(::Array{Any,1}, ::Function, ::Function, ::Base.Distributed.LocalProcess, ::Expr, ::Vararg{Expr,N} where N) at ./distributed/remotecall.jl:345
remotecall_fetch(::Function, ::Base.Distributed.LocalProcess, ::Expr, ::Vararg{Expr,N} where N) at ./distributed/remotecall.jl:344
#remotecall_fetch#144(::Array{Any,1}, ::Function, ::Function, ::Int64, ::Expr, ::Vararg{Expr,N} where N) at ./distributed/remotecall.jl:372
remotecall_fetch(::Function, ::Int64, ::Expr, ::Vararg{Expr,N} where N) at ./distributed/remotecall.jl:372
(::##73#75)() at ./distributed/macros.jl:102
Stacktrace:
 [1] sync_end() at ./task.jl:287
 [2] macro expansion at ./distributed/macros.jl:112 [inlined]
 [3] evolutionary_loop(::_population) at ./untitled-75c3e04a7f530386f03caa1b6d061e62:372
 [4] include_string(::String, ::String) at ./loading.jl:522
 [5] include_string(::Module, ::String, ::String) at /Users/yash/.julia/v0.6/Compat/src/Compat.jl:88
 [6] (::Atom.##112#116{String,String})() at /Users/yash/.julia/v0.6/Atom/src/eval.jl:109
 [7] withpath(::Atom.##112#116{String,String}, ::Void) at /Users/yash/.julia/v0.6/CodeTools/src/utils.jl:30
 [8] withpath(::Function, ::String) at /Users/yash/.julia/v0.6/Atom/src/eval.jl:38
 [9] hideprompt(::Atom.##111#115{String,String}) at /Users/yash/.julia/v0.6/Atom/src/repl.jl:67
 [10] macro expansion at /Users/yash/.julia/v0.6/Atom/src/eval.jl:106 [inlined]
 [11] (::Atom.##110#114{Dict{String,Any}})() at ./task.jl:80
while loading untitled-75c3e04a7f530386f03caa1b6d061e62, in expression starting on line 395

Я не уверен, как сделать удаленный вызов и как он работает. Я в основном запускаю цикл for в 16 процессах .pop.size = 100 ... и мне нужно запустить их в одном массиве.

Любая помощь очень ценится

1 Ответ

0 голосов
/ 04 июля 2018

Ваш код отсутствует @everywhere using StatsBase Поскольку каждый работник является дополнительным процессом, модуль StatsBase должен быть импортирован для всех работников.

Если вы используете @parallel цикл, вам не нужно ни @sync, ни @everywhere внутри цикла. @parallel просто делит цикл между рабочими и выполняет части для каждого рабочего. В зависимости от того, что вы хотите сделать, вам, вероятно, не хватает функции-агрегатора, поэтому обычно она равна:

@parallel (my_agg_function) for i in 1:n
   # do something - job will be evenly split across workers
end 

Пожалуйста, рассмотрите возможность использования pmap вместо @parallel.

@everywhere выполняет команду для всех работников. При параллельном моделировании он обычно используется для таких вещей, как инициализация переменных / состояний моделирования или импорт библиотек. Обратите внимание, что если вы хотите отправить данные между работниками, вы можете использовать ParallelDataTransfer.jl.

Последнее, но не менее важное: addprocs(16) внутри функции обычно не является хорошим шаблоном - новые 16 julia процессы будут появляться при каждом вызове функции. Вместо этого используйте параметр командной строки -p (например, запустите Джулию с командой julia -p 16).

...