我遇到了以下问题:
我有一个名为TrainModel的函数,它在一个线程上运行很长时间.当它完成计算时,它返回一个函数作为输出参数,让我们称之为f.当我询问这个f的类型时,朱莉娅回归:
(1种方法的通用功能)
(我不确定这最后一条信息对于阅读此内容的人有用)
现在,在第二步中,我需要在非常大的值数组上应用函数f.这是我想要并行化的一个步骤.已经启动了具有多个流程的Julia,例如
julia -p 4
Run Code Online (Sandbox Code Playgroud)
理想情况下,我会使用:
pmap(f, my_values)
Run Code Online (Sandbox Code Playgroud)
也许:
aux = @parallel (hcat) for ii=1:100000000
f(my_values[ii])
end
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用.朱莉娅抱怨工人不知道功能f,即我得到一个消息:
错误:过程2中未定义函数f
我怎样才能使功能˚F提供给所有工人呢?显然,一个"脏"的解决方案是对所有工人运行耗时的函数TrainModel,这可能是:
@everywhere f = TrainModel( ... )
Run Code Online (Sandbox Code Playgroud)
但是当我想要的只是结果f可供所有工作人员使用时,这将浪费cpu .
虽然我搜索了类似问题的帖子,但到目前为止我找不到答案......
提前致谢!最好,
N.
我需要在一些工人上并行完成某项任务.为此,我需要所有工人都能访问存储数据的矩阵.
我认为数据矩阵可以实现为共享阵列,以最大限度地减少数据移动.
为了让我开始使用共享阵列,我正在尝试以下非常简单的示例,它给出了我认为的意外行为:
julia -p 2
# the data matrix
D = SharedArray(Float64, 2, 3)
# initialise the data matrix with dummy values
for ii=1:length(D)
D[ii] = rand()
end
# Define some kind of dummy computation involving the shared array
f = x -> x + sum(D)
# call function on worker
@time fetch(@spawnat 2 f(1.0))
Run Code Online (Sandbox Code Playgroud)
最后一个命令给出了以下错误:
ERROR: On worker 2:
UndefVarError: D not defined
in anonymous at none:1
in anonymous at multi.jl:1358
in anonymous at multi.jl:904
in run_work_thunk at …Run Code Online (Sandbox Code Playgroud) 不久前我被说服放弃了我舒适的matlab编程并开始在Julia编程.我一直在用神经网络工作很长时间,我认为,现在有了Julia,我可以通过并行计算梯度来更快地完成任务.
无需一次性对整个数据集计算梯度; 相反,人们可以拆分计算.例如,通过将数据集分成几部分,我们可以计算每个部分的部分梯度.然后通过将部分梯度相加来计算总梯度.
虽然原理很简单,但当我与Julia并行时,我会遇到性能下降,即一个进程比两个进程更快!我显然做错了什么......我已经咨询过论坛中提出的其他问题,但我仍然无法拼凑出答案.我认为我的问题在于有很多不必要的数据正在发生,但我无法正确修复它.
为了避免发布凌乱的神经网络代码,我发布了一个更简单的例子,它在线性回归的设置中复制了我的问题.
下面的代码块为线性回归问题创建了一些数据.代码解释了常量,但X是包含数据输入的矩阵.我们随机创建一个权重向量w ^当与乘以X创造一些目标ÿ.
######################################
## CREATE LINEAR REGRESSION PROBLEM ##
######################################
# This code implements a simple linear regression problem
MAXITER = 100 # number of iterations for simple gradient descent
N = 10000 # number of data items
D = 50 # dimension of data items
X = randn(N, D) # create random matrix of data, data items appear row-wise
Wtrue = randn(D,1) # create arbitrary weight …Run Code Online (Sandbox Code Playgroud) 我在 Julia 中正确使用 ForwardDiff 包时遇到了一些问题。我设法在以下代码块中隔离了我的问题。
简而言之,我定义了函数:
using ForwardDiff
function likelihood(mu,X)
N = size(X,2)
# Calculate likelihood
aux = zeros(N)
for nn=1:N
aux[nn] = exp(-0.5 * (X[:,nn]-mu)' * (X[:,nn]-mu))[1]
end
# return log-likelihood
return sum(log(aux))
end
Run Code Online (Sandbox Code Playgroud)
然后我检查该功能是否有效:
# Check if function works at all
X = randn(2,3) # some random data
mu = [1.0;2.0] # arbitrary mean
@show likelihood(mu,X) # works fine for me
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用以下方法获得梯度:
ForwardDiff.gradient( ARG -> likelihood(ARG, X), mu)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这失败了,我在屏幕上看到:
错误: MethodError:
converthas no method matching convert(::Type{Float64}, ::ForwardDiff.Dual{2,Float64}) …
以下简单的代码返回,在我看来,一个意外的结果:
srand(101)
# create a multidimensional array that will house 3 matrices of dimensions 2x2
A = Array(Array{Float64,2},3)
# initialise array with zero matrices (is this the culprit?)
fill!(A, zeros(2,2))
# populate array (some dummy computation to illustrate my problem)
for ii=1:2
for jj=1:2
aux = randn(1,3)
for dd=1:3
A[dd][ii,jj]=aux[dd]
end
end
end
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码时,我的数组A读取:
3-element Array{Array{Float64,2},1}:
2x2 Array{Float64,2}:
1.2821 -2.10146
-1.00158 1.8163
2x2 Array{Float64,2}:
1.2821 -2.10146
-1.00158 1.8163
2x2 Array{Float64,2}:
1.2821 -2.10146
-1.00158 1.8163
Run Code Online (Sandbox Code Playgroud)
当我实际创建它们时,为什么三个2x2矩阵相同?
我确实理解在将数组分配给Julia中的数组时必须要小心,但不知何故错误使我无法理解.
我发现的有趣的事情是,如果我初始化A如下:
for dd=1:3
A[dd] …Run Code Online (Sandbox Code Playgroud)