本地计算机(PC)上UI右上角的下拉菜单:
Kernel->
Change kernel->
Python 2 (on a local PC)
Python 3 (on a local PC)
My new kernel (on a remote PC)
Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用Mac,所以如果这听起来太天真,请原谅我.
我正在尝试安装Interactive Parallel.来自https://github.com/ipython/ipyparallel,它说我需要找到jupyter_notebook_config.py.
我已经安装了python和相关软件包Anaconda,我可以使用ipython笔记本.但是,当我搜索spotlight了jupyter_notebook_config.py,我无法找到该文件:
那么,我在哪里可以找到这个文件?
更新:这是我的home文件夹:
只有anaconda.
我在具有不同参数的循环中运行相同的模拟.每个模拟都使用一个data只读取的pandas DataFrame(),从不修改.使用ipyparallel(IPython parallel),我可以在模拟开始之前将此DataFrame放入我视图中每个引擎的全局变量空间:
view['data'] = data
Run Code Online (Sandbox Code Playgroud)
然后,引擎可以访问DataFrame以获取在其上运行的所有模拟.复制数据的过程(如果是腌制的,data是40MB)只需几秒钟.但是,似乎如果模拟的数量增加,则内存使用量会变得非常大.我想这个共享数据是为每个任务而不是仅为每个引擎复制的.从具有引擎的客户端共享静态只读数据的最佳实践是什么?每个引擎复制一次是可以接受的,但理想情况下每个主机只需要复制一次(我在host1上有4个引擎,在host2上有8个引擎).
这是我的代码:
from ipyparallel import Client
import pandas as pd
rc = Client()
view = rc[:] # use all engines
view.scatter('id', rc.ids, flatten=True) # So we can track which engine performed what task
def do_simulation(tweaks):
""" Run simulation with specified tweaks """
# Do sim stuff using the global data DataFrame
return results, id, tweaks
if __name__ == '__main__':
data = pd.read_sql("SELECT …Run Code Online (Sandbox Code Playgroud) 在使用2Tb DRAM的80核(160HT)nehalem架构上运行一些测试后,我遇到了一个小的HPC问题:
当每个线程开始请求关于"错误"套接字上的对象的信息时,具有多于2个套接字的服务器开始停顿很多(延迟),即请求来自正在处理一个套接字上的某些对象的线程以提取信息这实际上是在另一个插槽上的DRAM中.
即使我知道他们正在等待远程套接字返回请求,核心也会100%被利用.
由于大多数代码以异步方式运行,因此重写代码要容易得多,因此我只需解析来自一个套接字上的线程的消息就可以解析其他代码(没有锁定等待).另外我想将每个线程锁定到内存池,因此我可以更新对象而不是浪费时间(~30%)在垃圾收集器上.
因此问题是:
如何在Python中使用预定的内存池对象将线程固定到核心?
更多背景:
当你把ZeroMQ放在中间并且在每个ZMQworker管理的内存池之间传递消息时,Python运行多核没有问题.在ZMQ的8M msg /秒时,对象的内部更新需要比管道填充更长的时间.这一切都在这里描述:http://zguide.zeromq.org/page:all # Chapter-Sockets-and-Patterns
因此,稍微过度简化,我会生成80个ZMQworkerprocesses和1个ZMQrouter,并使用大量对象加载上下文(实际上是5.84亿个对象).从这个"起始点"开始,对象需要进行交互以完成计算.
这是个主意:
要做到这一点,我需要知道:
但是我无法在python文档中找到关于如何执行此操作的参考资料,并且在google上我必须搜索错误的内容.
更新:
关于"为什么在MPI架构上使用ZeroMQ?"的问题,请阅读主题:Spread vs MPI vs zeromq?由于我工作的应用程序被设计用于即使它在架构测试,其中MPI分布式部署是更合适的.
更新2:
关于这个问题:
"如何在Python(3)中将线程固定到具有预定内存池的核心"答案在psutils中:
>>> import psutil
>>> psutil.cpu_count()
4
>>> p = psutil.Process()
>>> p.cpu_affinity() # get
[0, 1, 2, 3]
>>> p.cpu_affinity([0]) # set; from now on, this process will run on CPU #0 only
>>> p.cpu_affinity()
[0]
>>>
>>> # reset affinity …Run Code Online (Sandbox Code Playgroud) 我正在试验,IPython.parallel只是想在不同的引擎上启动几个shell命令.
我有以下笔记本:
单元格0:
from IPython.parallel import Client
client = Client()
print len(client)
5
Run Code Online (Sandbox Code Playgroud)
并启动命令:
单元格1:
%%px --targets 0 --noblock
!python server.py
Run Code Online (Sandbox Code Playgroud)
单元格2:
%%px --targets 1 --noblock
!python mincemeat.py 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
单元格3:
%%px --targets 2 --noblock
!python mincemeat.py 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
它的作用是使用mincemeatMapReduce 的实现.当我启动第!python mincemeat.py 127.0.0.1一个核心时,它大约使用100%的一个核心,然后当我启动第二个核心时,每个核心降低到50%.我在机器上有4个核心(+虚拟核心),可以直接从终端启动而不是在笔记本电脑中使用它们.
有什么我想念的吗?我想为每个!python mincemeat.py 127.0.0.1命令使用一个核心.
编辑:
为清楚起见,这是另一个不使用多核的东西:
单元格1:
%%px --targets 0 --noblock
a = 0
for i in xrange(100000):
for j in xrange(10000):
a += 1
Run Code Online (Sandbox Code Playgroud)
单元格2:
%%px --targets 0 --noblock
a = …Run Code Online (Sandbox Code Playgroud) 我正在使用 ipyparallel 模块来加速所有列表的比较,但我遇到了内存消耗巨大的问题。
这是我正在运行的脚本的简化版本:
从 SLURM 脚本启动集群并运行 python 脚本
ipcluster start -n 20 --cluster-id="cluster-id-dummy" &
sleep 60
ipython /global/home/users/pierrj/git/python/dummy_ipython_parallel.py
ipcluster stop --cluster-id="cluster-id-dummy"
Run Code Online (Sandbox Code Playgroud)
在 python 中,为简化示例创建两个列表列表
import ipyparallel as ipp
from itertools import compress
list1 = [ [i, i, i] for i in range(4000000)]
list2 = [ [i, i, i] for i in range(2000000, 6000000)]
Run Code Online (Sandbox Code Playgroud)
然后定义我的列表比较函数:
def loop(item):
for i in range(len(list2)):
if list2[i][0] == item[0]:
return True
return False
Run Code Online (Sandbox Code Playgroud)
然后连接到我的 ipython 引擎,将 list2 推送到每个引擎并映射我的函数:
rc = ipp.Client(profile='default', cluster_id = "cluster-id-dummy") …Run Code Online (Sandbox Code Playgroud) 我有以下内容:
我在命令行输入了ipcluster:
ipcluster nbextension enable
Run Code Online (Sandbox Code Playgroud)
我正在尝试在Jupyter笔记本上的IPython Clusters选项卡上创建一个新集群,但这就是我所看到的:
我之前能做到这一点.谢谢!
我是IPython的新手,想在运行IPython并行集群功能时将中间结果打印到stdout.(我知道有多个进程,这可能会破坏输出,但这很好 - 它只是用于测试/调试,而我正在运行的进程足够长,以至于不太可能发生此类冲突.)我检查了IPython的文档,但找不到并行化函数打印的示例.基本上,我正在寻找一种方法将子进程的打印输出重定向到主stdout,IPython相当于
subprocess.Popen( ... , stdout=...)
Run Code Online (Sandbox Code Playgroud)
在流程内打印不起作用:
rc = Client()
dview = rc()
def ff(x):
print(x)
return x**2
sync = dview.map_sync(ff,[1,2,3,4])
print('sync res=%s'%repr(sync))
async = dview.map_async(ff,[1,2,3,4])
print('async res=%s'%repr(async))
print(async.display_outputs())
Run Code Online (Sandbox Code Playgroud)
回报
sync res=[1, 4, 9, 16]
async res=[1, 4, 9, 16]
Run Code Online (Sandbox Code Playgroud)
因此计算正确执行,但函数ff中的print语句永远不会打印,即使返回所有进程也是如此.我究竟做错了什么?如何让"打印"工作?
python printing parallel-processing ipython ipython-parallel
我一直在玩IPython.parallel并且我想使用我自己的一些自定义模块,但是无法按照烹饪书中的说明使用它dview.sync_imports().对我有用的唯一一件事就是
def my_parallel_func(args):
import sys
sys.path.append('/path/to/my/module')
import my_module
#and all the rest
Run Code Online (Sandbox Code Playgroud)
然后在主要的到
if __name__=='__main__':
#set up dview...
dview.map( my_parallel_func, my_args )
Run Code Online (Sandbox Code Playgroud)
在我看来,正确的方法是这样的
with dview.sync_imports():
import sys
sys.path.append('/path/to/my/module')
import my_module
Run Code Online (Sandbox Code Playgroud)
但是这会抛出一个错误,说没有命名的模块my_module.
那么,使用它的正确方法是什么dview.sync_imports()?
我试图使用ipyparallel系统运行一个工作,lru_cache并遇到问题.
从终端:
ipcluster start -n 2
Run Code Online (Sandbox Code Playgroud)
在ipython笔记本中:
from ipyparallel import Client
clients = Client()
def world():
return hello() + " World"
def hello():
return "Hello"
world()
'Hello World'
Run Code Online (Sandbox Code Playgroud)
使用ipyparallel运行它需要:
clients[:].push(dict(hello=hello))
Run Code Online (Sandbox Code Playgroud)
如果没有上一行,则以下操作失败,这不是意料之外的,但如果运行则可以正常工作:
clients[:].apply_sync(world)
['Hello World', 'Hello World']
Run Code Online (Sandbox Code Playgroud)
然而,这一切都按预期工作,lru_cache并行步骤会产生错误
from ipyparallel import Client
from functools import lru_cache
clients = Client()
def world():
return hello() + " World"
@lru_cache(maxsize=2048)
def hello():
return "Hello"
clients[:].push(dict(hello=hello))
clients[:].apply_sync(world)
Run Code Online (Sandbox Code Playgroud)
此操作失败,并显示以下错误:
[0:apply]:
---------------------------------------------------------------------------NameError
Traceback (most recent call last)<string> in <module>()
<ipython-input-17-9ac5ef032485> in world()
NameError: …Run Code Online (Sandbox Code Playgroud) ipython-parallel ×10
python ×9
ipython ×8
hpc ×1
jupyter ×1
macos ×1
mapreduce ×1
printing ×1
threadpool ×1