小编use*_*310的帖子

Julia并行编程 - 使所有工作人员都可以使用现有功能

我遇到了以下问题:

我有一个名为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.

parallel-processing for-loop julia

20
推荐指数
1
解决办法
1431
查看次数

Julia中的共享阵列用法

我需要在一些工人上并行完成某项任务.为此,我需要所有工人都能访问存储数据的矩阵.

我认为数据矩阵可以实现为共享阵列,以最大限度地减少数据移动.

为了让我开始使用共享阵列,我正在尝试以下非常简单的示例,它给出了我认为的意外行为:

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)

arrays parallel-processing julia

8
推荐指数
1
解决办法
2200
查看次数

Julia中的并行梯度计算

不久前我被说服放弃了我舒适的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)

parallel-processing gradient linear-regression julia

7
推荐指数
1
解决办法
505
查看次数

在 Julia 中使用 ForwardDiff 进行自动微分

我在 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}) …

automatic-differentiation julia

4
推荐指数
1
解决办法
600
查看次数

在朱莉娅分配到多维数组

以下简单的代码返回,在我看来,一个意外的结果:

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)

variable-assignment multidimensional-array julia

3
推荐指数
1
解决办法
475
查看次数