标签: parallel-processing

如何高效并行brms::brm?

问题总结

我正在将brms::brm_multiple()模型拟合到大型数据集,其中使用该包估算了缺失的数据mice。数据集的大小使得并行处理的使用非常可取。但是,我不清楚如何最好地使用计算资源,因为我不清楚如何brms在核心之间划分估算数据集的采样。

如何选择以下选项以最大限度地有效利用计算资源?

  • 插补数 ( m)
  • 链数 ( chains)
  • 核心数 ( cores)

概念示例

假设我天真地(或者为了举例而故意愚蠢地)选择m = 5, chains = 10, cores = 24。因此,需要在 HPC 上保留的 24 个核心之间分配 5 x 10 = 50 个链。如果没有并行处理,这将需要约 50 个时间单位(不包括编译时间)。

我可以想象 的三种并行化策略brms_multiple(),但可能还有其他策略:

场景 1:并行估算数据集,串行关联链

这里,5 个插补中的每一个都分配给它自己的处理器,该处理器串行运行 10 个链。处理时间为 10 个单位(与非并行处理相比,速度提高了 5 倍),但糟糕的规划浪费了 19 个核心 x 10 个时间单位 = 190 个核心时间单位(ctu;= 80% 的预留计算资源)。有效的解决方案是设置cores= m

场景 2:串行估算数据集,并行关联链

在这里,采样首先获取第一个估算数据集,并在 …

parallel-processing r rstan

5
推荐指数
0
解决办法
2080
查看次数

如何通过 multiprocessing.Pool 判断 apply_async 函数是否已启动或者是否仍在队列中

我正在使用 python 的 multiprocessing.Pool 和 apply_async 来调用一堆函数。

如何判断函数是否已开始由池中的成员处理或者是否位于队列中?

例如:

import multiprocessing
import time

def func(t):
    #take some time processing
    print 'func({}) started'.format(t)
    time.sleep(t)

pool = multiprocessing.Pool()

results = [pool.apply_async(func, [t]) for t in [100]*50] #adds 50 func calls to the queue

Run Code Online (Sandbox Code Playgroud)

对于每个AsyncResultin,results您可以调用ready()get(0)来查看 func 是否完成运行。但是如何知道 func 是否 已开始但尚未完成呢?

即对于给定的 AsyncResult 对象(即给定的结果元素),有没有办法查看该函数是否已被调用或者它是否位于池的队列中?

python parallel-processing python-multiprocessing

5
推荐指数
1
解决办法
1237
查看次数

Python 并行计算 - Scoop

我试图熟悉 Scoop 库(此处的文档: https: //media.readthedocs.org/pdf/scoop/0.7/scoop.pdf)以学习如何并行执行统计计算,特别是使用 future。地图功能。

因此,首先,我想尝试运行一个简单的线性回归,并使用从正态分布随机生成的 10000000 个数据点(4 个特征,1 个目标变量)来评估串行计算和并行计算之间的性能差异。

这是我的代码:

import pandas as pd
import numpy as np
import random
from scoop import futures
import statsmodels.api as sm
from time import time

def linreg(vals):
    global model
    model = sm.OLS(y_vals,X_vals).fit()
    return model
    print(model.summary())    

if __name__ == '__main__':

    random.seed(42)
    vals = pd.DataFrame(np.random.normal(loc = 3, scale = 100, size =(10000000,5)))
    vals.columns = ['dep', 'ind1', 'ind2', 'ind3', 'ind4']
    y_vals = vals['dep']
    X_vals = vals[['ind1', 'ind2', 'ind3', 'ind4']]

    bt = time()
    model_vals …
Run Code Online (Sandbox Code Playgroud)

python parallel-processing machine-learning linear-regression python-scoop

5
推荐指数
0
解决办法
794
查看次数

如何在 Dask 中正确使用 client.scatter

当执行“大量”任务时,我收到此错误:

考虑使用 client.scatter 提前分散大型对象,以减轻调度程序负担并保留工作人员的数据

我还收到了一堆这样的消息:

tornado.application - ERROR - Exception in callback <bound method BokehTornado._keep_alive of <bokeh.server.tornado.BokehTornado object at 0x7f20d25e10b8>>
Traceback (most recent call last):
  File "/home/muammar/.local/lib/python3.7/site-packages/tornado/ioloop.py", line 907, in _run
    return self.callback()
  File "/home/muammar/.local/lib/python3.7/site-packages/bokeh/server/tornado.py", line 542, in _keep_alive
    c.send_ping()
  File "/home/muammar/.local/lib/python3.7/site-packages/bokeh/server/connection.py", line 80, in send_ping
    self._socket.ping(codecs.encode(str(self._ping_count), "utf-8"))
  File "/home/muammar/.local/lib/python3.7/site-packages/tornado/websocket.py", line 447, in ping
    raise WebSocketClosedError()
tornado.websocket.WebSocketClosedError
tornado.application - ERROR - Exception in callback <bound method BokehTornado._keep_alive of <bokeh.server.tornado.BokehTornado object at 0x7f20d25e10b8>>
Traceback (most recent call last):
  File "/home/muammar/.local/lib/python3.7/site-packages/tornado/ioloop.py", line …
Run Code Online (Sandbox Code Playgroud)

parallel-processing python-3.x dask dask-distributed

5
推荐指数
1
解决办法
6548
查看次数

SCIP 中线程的使用

在 SCIP 参数列表中,我看到三种类型的线程使用引用:

  • lp/threads(根据这个问题,用于求解LP的线程在使用SoPlex时并不重要)。

  • parallel/{min, max}threads(并行求解期间的线程数)。

  • concurrent/*(与并发模式下使用线程相关的参数)。

我的问题是:使用默认安装时 SCIP 中如何使用线程?这些参数与并发求解器parallel/{min, max}threads相关吗?如果我不打开并发求解器,SCIP 是否会使用可用线程来并行求解分支定界子问题?

提前致谢!

parallel-processing mathematical-optimization scip

5
推荐指数
1
解决办法
2510
查看次数

在 #define 宏中控制条件 Openmp

我想用一个#define标志来控制是否使用 openmp。由于#pragma不能不在 a 内#define,所以我尝试了

#define USE_OPENMP  // Toggle this on/off

#ifdef USE_OPENMP
    #define OMP_FOR(n)   __pragma("omp parallel for if(n>10)") 
#else
    #define OMP_FOR(n)   // do nothing        
#endif
Run Code Online (Sandbox Code Playgroud)

然后在我的代码中我可以:

int size_of_the_loop = 11;
OMP_FOR(size_of_the_loop) // activate openmp if(n>10)
for(){
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

我对#define相关的东西不熟悉,想知道是否可以实现这一目标?谢谢。

c++ parallel-processing openmp visual-studio

5
推荐指数
2
解决办法
3649
查看次数

利用 SLURM 上的所有 CPU

我想在集群上运行作业。不同节点上有不同数量的 CPU,我不知道哪些节点将分配给我。正确的选项是什么,以便作业可以在所有节点上创建与 CPU 一样多的任务?

#!/bin/bash -l

#SBATCH -p normal
#SBATCH -N 4
#SBATCH -t 96:00:00

srun -n 128 ./run
Run Code Online (Sandbox Code Playgroud)

parallel-processing multithreading hpc mpi slurm

5
推荐指数
1
解决办法
1845
查看次数

R未来多会话限制cpu数量

我目前正在使用 future 包进行并行化,如下所示:

plan(multisession, gc = TRUE)
standardised_addresses1 <- future_lapply(1:20000, function(x) x*x) 
Run Code Online (Sandbox Code Playgroud)

问题是它使用了服务器上的所有 CPU。我想通过设置如下参数来限制使用的CPU数量:workers = 18

parallel-processing r cpu-usage r-future

5
推荐指数
1
解决办法
1442
查看次数

torch.nn.DataParallel 如何更改输出大小?

看起来使用torch.nn.DataParallel改变了输出大小。尽管在官方文档https://pytorch.org/docs/stable/nn.html#torch.nn.DataParallel中 ,有关大小更改的所有信息如下:

当模块在forward()中返回一个标量(即0维张量)时,该包装器将返回一个长度等于数据并行中使用的设备数量的向量,其中包含每个设备的结果。

我的模块返回 10 个坐标的张量,并且我有 2 个 GPU,我想在其中运行代码。我的 CNN 的最后一层是nn.Linear(500, 10).

import torch
import torch.nn as nn

net = LeNet()    #CNN-class written above
device = torch.device("cuda:0")
net.to(device)
net = nn.DataParallel(net)

#skipped some code, where inputs and targets are loaded from files

output = net(input)
criterion = nn.SmoothL1Loss()
loss = criterion(output, target)
Run Code Online (Sandbox Code Playgroud)

请注意,不调用DataParallel这段代码也可以正常工作。DataParallel当尝试计算损失时会发生运行时错误。

RuntimeError: The size of tensor a (20) must match the size of tensor b (10) at non-singleton …
Run Code Online (Sandbox Code Playgroud)

parallel-processing conv-neural-network pytorch

5
推荐指数
1
解决办法
1991
查看次数

C++17/20 并行算法:对对象的不同步访问

阅读[algorithms.parallel.exec]p2上最新的 C++20 草案,我发现了 C++17 中没有的一段:

\n\n
\n

如果某个对象被元素访问函数修改,则该算法将不会对该对象执行其他非同步访问。修改元素访问函数是那些被指定为修改对象的函数。[注意:例如,swap++--@=和 赋值修改对象。对于赋值和@=运算符,仅修改左侧参数。\xe2\x80\x94尾注]

\n
\n\n

这究竟保证了什么?为什么添加它?

\n\n

例如,这是否保证“并行”算法在算法的整个执行过程中不会将迭代器递增两次?(或者,如果是的话,它将以同步/顺序的方式)?

\n

c++ algorithm parallel-processing language-lawyer c++20

5
推荐指数
0
解决办法
175
查看次数