问题标签 [ipython-parallel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 如何在 ipython 并行引擎上使用 %autoreload?
是否可以让魔术命令 %autoreload 在远程 ipengines 上工作?
以下作品:
然后我将 blah 更改为返回 8:
但我想做的是:
并跳过重新加载步骤。但是,当我尝试这样做时,更改不会生效,并且 blah.test() 仍然使用旧版本的代码。为了确保执行命令没有做错,我还尝试使用魔法功能:
这仍然没有给我自动重新加载功能。
谢谢。
ipython - 在 Sun Grid Engine 上使用 IPython Parallel
我正在尝试将 IPython Parallel 用于一个非常常见的场景,我想在运行 Sun Grid Engine 的集群上运行模拟,但我找不到可靠的方法来做到这一点。
这是我想做的事情:
我想用几个不同的参数值运行数值模拟(使用 Numpy 数组)——这些任务显然/'令人尴尬'并行。我可以(通过 ssh)访问运行 Grid Engine 的集群的头节点。到目前为止,我一直在使用 QSUB 命令运行 shell 脚本,但这非常笨拙(处理节点崩溃等),我正在寻找一种在 Python 中实现所有这些的方法。
IPython 似乎非常适合这种情况,但要让设置顺利运行变得很麻烦。我在头节点上使用 IPCLUSTER 启动 n 个(比如 20 个)引擎,然后将 .json 文件复制到我使用 IPython.parallel.Client 连接的本地计算机。
我已经设置 IPClusterStart.controller_launcher_class = 'SGEControllerLauncher'
和IPClusterEngines.engine_launcher_class = 'SGEEngineSetLauncher'
IPCLUSTER 似乎运行良好;我从 ssh 终端上的头节点得到这个输出:
但是,我有这些问题:
很多时候,即使我看到上面显示引擎已成功启动的消息,许多引擎仍无法向控制器注册。当我使用 20 个引擎启动 IPCLUSTER 时,我可以看到 Grid Engine 队列中出现了 10 - 15 个引擎。我不知道其他引擎会发生什么——没有输出文件。在这 10-15 个引擎中,仅启动其中一些引擎向控制器注册,我在它们的输出文件中看到了这一点:
在其他人身上,我看到了这个:
知道为什么会这样吗?
有时,引擎启动并成功注册,但是当我让它们运行一些非常简单的东西时它们开始死亡,
view.execute('%pylab')
我得到的唯一例外是:[引擎异常] Traceback(最近一次调用最后):文件“/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/IPython/parallel/client/client.py”,第 708 行, 在 _handle_strand_msgs 中引发错误。EngineError("Engine %r dead while running task %r"%(eid, msg_id)) EngineError: Engine 1 dead while running task 'b9601e8a-cff5-4037-b9d9-a0b93ca2f256'
以这种方式启动引擎意味着只要引擎正在运行,我就占用节点和队列,即使它们没有执行任何操作。是否有一种简单的方法来启动引擎,以便它们仅在您想要运行某些脚本时才会生成,并且一旦它们返回计算结果就会关闭?
Grid Engine 似乎每次都在不同的节点上启动控制器,因此 IPCLUSTER 配置文件中的 --ruse 标志没有用;每次使用 IPCLUSTER 时,我都必须复制 JSON 文件。有没有办法避免这种情况?
如果有人可以为这种常见场景提供一个简单的工作流程,那将非常有帮助:使用 IPython 并行通过 SSH 连接将明显并行的作业提交到 SGE 集群。应该有某种方法来处理引擎崩溃的重新提交,如果有一种方法可以仅在模拟期间使用集群资源,那也很好。
python - 是否值得将 IPython 与 scipy 的 eig 并行使用?
我正在编写一个必须计算大量特征值问题的代码(典型的矩阵维度是几百个)。我想知道是否可以通过使用IPython.parallel
module. 作为前 MATLAB 用户和 Python 新手,我一直在寻找类似于 MATLAB 的parfor
...
在网上的一些教程之后,我编写了一个简单的代码来检查它是否可以加快计算速度,我发现它并没有而且实际上通常会减慢它的速度(视情况而定)。我认为,我可能遗漏了一点,并且可能scipy.linalg.eig
以这样一种方式实现,即它使用所有可用的内核并通过尝试并行化它来中断引擎管理。
这是“并行”代码:
非并行变体:
两者的 CPU 时间差异非常微妙。如果在特征值问题之上,并行化函数必须进行更多矩阵运算,它开始永远持续下去,即至少比非并行化变体长 5 倍。
我对特征值问题并不真正适合这种并行化是对的,还是我错过了重点?
非常感谢!
2013 年 7 月 29 日编辑;英国夏令时 12:20
按照 moarningsun 的建议,我尝试在eig
使用mkl.set_num_threads
. 对于 500×500 矩阵,最少 50 次重复设置如下:
除了一个线程情况之外,没有实质性差异(也许 50 个样本有点小......)。我仍然认为我没有抓住重点,可以做很多事情来提高性能,但不确定如何做。这些是在启用了超线程的 4 核机器上运行的,提供 4 个虚拟内核。
感谢您的任何意见!
python - 如何将线程固定到具有预定内存池对象的内核?(80 核 Nehalem 架构 2Tb RAM)
在使用 2Tb DRAM 的 80 核 (160HT) nehalem 架构上运行一些测试后,我遇到了一个小的 HPC 问题:
具有超过 2 个套接字的服务器开始大量停止(延迟),因为每个线程开始请求有关“错误”套接字上的对象的信息,即请求来自正在处理一个套接字上的某些对象的线程以提取信息这实际上是在另一个插槽上的 DRAM 中。
尽管我知道它们正在等待远程套接字返回请求,但这些内核似乎已被 100% 使用。
由于大多数代码是异步运行的,因此重写代码要容易得多,因此我可以将来自一个套接字上的线程的消息解析为另一个线程(无锁定等待)。此外,我想将每个线程锁定到内存池,这样我就可以更新对象,而不是在垃圾收集器上浪费时间(~30%)。
因此问题是:
如何在 Python 中使用预定的内存池对象将线程固定到内核?
更多上下文:
当您将 ZeroMQ 放在中间并在每个 ZMQworker 管理的内存池之间传递消息时,Python 运行多核是没有问题的。在 ZMQ 的 8M 消息/秒下,对象的内部更新所用的时间比管道可以填充的时间长。这一切都在这里描述:http: //zguide.zeromq.org/page :all#Chapter-Sockets-and-Patterns
因此,稍微简化一下,我生成了 80 个 ZMQworkerprocesses 和 1 个 ZMQrouter 并使用大量对象(实际上是 5.84 亿个对象)加载上下文。从这个“起点”开始,对象需要交互以完成计算。
这是这样的想法:
- 如果“对象 X”需要与“对象 Y”交互,并且在 python 线程的本地内存池中可用,则应直接进行交互。
- 如果“对象 Y”在同一个池中不可用,那么我希望它通过 ZMQrouter 发送消息并让路由器在稍后的某个时间点返回响应。我的架构是非阻塞的,因此特定 python 线程中发生的事情会继续进行,而无需等待 zmqRouters 响应。即使对于同一个套接字上但在不同内核上的对象,我也不希望进行交互,因为我更喜欢干净的消息交换,而不是让 2 个线程操作同一个内存对象。
为此,我需要知道:
- 如何确定给定 python 进程(线程)在哪个套接字上运行。
- 如何将该特定套接字上的内存池分配给 python 进程(一些 malloc 限制或类似限制,以便内存池的总和不会将内存池从一个套接字推到另一个套接字)
- 我没有想到的事情。
但是我在 python 文档中找不到有关如何执行此操作的参考,并且在谷歌上我必须搜索错误的东西。
更新:
关于“为什么在 MPI 架构上使用 ZeroMQ?”的问题,请阅读线程:Spread vs MPI vs zeromq?因为我正在开发的应用程序是为分布式部署而设计的,即使它是在 MPI 更适合的架构上进行测试的。
更新 2:
关于这个问题:
“如何在 Python(3) 中将线程固定到具有预定内存池的内核”答案在psutils中:
worker 可以与一个核心挂钩,从而可以有效地利用 NUMA(查找您的 CPU 类型以验证它是一个 NUMA 架构!)
ipython - IPython并行引擎的实时输出?
我正在使用 IPython 强大的并行化功能运行一堆长时间运行的任务。
如何在 IPython 客户端中从 ipengines 的标准输出获取实时输出?
例如,我正在运行dview.map_async(fun, lots_of_args)
并fun
打印到标准输出。我想看到正在发生的输出。
我知道AsyncResult.display_output()
,但它只有在所有任务完成后才可用。
python - 如何将 IPython.parallel map() 与生成器一起用作函数的输入
我正在尝试使用 IPython.parallel 地图。我希望并行化的函数的输入是生成器。由于大小/内存的原因,我无法将生成器转换为列表。请参见下面的代码:
database - 从 IPython 并行集线器数据库中检索结果
我一直在使用 IPython 并行在 SGE 集群上运行并行作业。稍后,当所有作业完成后,我使用作业消息 ID 提交我的作业并从中心数据库 (SQlite) 检索结果。这工作正常,直到我的控制器崩溃;在重新启动控制器时,我无法检索提交给旧控制器的作业。我收到了这个错误:
数据库文件 (tasks.db) 仍然存在,并且大小与集线器崩溃前相同。所以,我确定结果在数据库中。我可以使用新控制器检索它们吗?另外,如果我使用 bd_query 命令:
我得到一个空的结果。
python - 基于 IPython 上 sum() 的执行时间差
我正在使用 IPython 的 ipcluster 引擎进行简单的蒙特卡洛模拟练习。根据我定义函数的方式,我注意到执行时间存在巨大差异,我正在询问原因。以下是详细信息:
当我将任务定义如下时,它很快:
并行运行时:
但是,如果我将功能更改为:
我得到:
3.141232 1 个循环,最好的 1:每个循环 3.81 秒
...慢了 71 倍。这可能是什么原因?
python - 使用 sync_imports() 在 IPython.parallel 引擎上导入自定义模块
我一直在玩 IPython.parallel 并且我想使用我自己的一些自定义模块,但无法按照食谱中的说明使用dview.sync_imports()
. 唯一对我有用的是
然后主要只是为了
在我看来,正确的方法是这样的
但这会引发错误,指出没有名为my_module
.
那么,使用它的正确方法是什么dview.sync_imports()
?
ipython - ipcluster 命令未创建全套引擎
使用 Ubuntu 12.04 我正在尝试设置 LAN 集群。细节:
控制器配置
集群配置
引擎配置
所以,然后运行
产生以下结果:
在我看来很好。但是当我尝试与客户建立联系时,我得到的引擎数量少于预期的数量。即使在一台远程机器上运行 1 或 2 个引擎也会发生这种情况
如果这是问题,我将超时设置得很高,但它仍然存在。
如果我单独运行ipcontroller
,ipengines
该过程会成功,但我真的更希望能够使用ipcluster
.