我正在尝试将 ipyparallel 与我安装在 conda env 中的自定义内核一起使用。我的工具是用 matplotlib 2.0.2 构建的。我在 Jupyter Hub 上运行,默认 Python3 内核指向 matplotlib 1.5.3。我可以通过这个例子从各自的引擎中看到 matplotlib 的版本:
import ipyparallel
import matplotlib
def myFunc(n):
import matplotlib
status = "mpl version=%s, and num=%d" % (matplotlib.__version__,
n * 10)
return status
rc=ipyparallel.Client(profile='MJBtest')
all_proc = rc[:]
all_proc.block=True
print("Local: ", matplotlib.__version__)
inlist = [i for i in range(3)]
print("Now calling map_sync")
result = all_proc.map_sync(myFunc, inlist)
print("Parallel result : ", result)
返回
Local: 1.5.3
Now calling map_sync
Parallel result : ['mpl version=1.5.3, and num=0', 'mpl version=1.5.3, and num=10', 'mpl version=1.5.3, and num=20']
正如我所料,因为我在 Python 3 默认内核中运行。通过使用我想要的工具创建自定义内核、激活它并使用以下命令创建 kernelspec 文件,我构建了一个名为“cetb3”的自定义内核:
ipython kernel install --user --name cetb3
在cetb3环境下,可以运行python,导入matplotlib,看到版本是matplotlib 2.0.2。在同一个 cetb3 环境中,我还创建了一个测试配置文件:
ipython profile create --parallel --profile=MJBtest
在 Jupyter Hub 中,我可以将内核切换到 cetb3,导入 matplotlib 并查看它是 v2.0.2。但是,当我从 MJBtest 启动集群并尝试使用 cetb3 内核运行与上述相同的代码时,单元在“现在调用 map_sync”行之后挂起并且永远不会返回:
Local: 2.0.2
Now calling map_sync
我认为我可能必须创建一个使用我的自定义内核的 ipython 配置文件,我尝试将我的配置文件的名称添加到 cetb3 kernelspec 文件:“--profile=MJBtest”但是当我这样做时,内核不会甚至开始。我不清楚是否必须将我的配置文件告诉我的内核,反之亦然(以及我如何做到这一点),或者是否有一些其他机制可以将我的自定义环境推送到我的 ipyparallel 引擎。
所以我在我们的超级计算机上与系统管理员合作,结果发现他们已经配置了一些定制的 ipython 配置文件,这些配置文件正在使用 ipengine 命令启动引擎集群。在 ipcluster_config.py 文件中,在 ipengine 命令之前,我可以通过将我的 conda env bin 路径添加到 PATH env 变量的开头来指定我的自定义环境,然后为我想要的 conda env 调用 source activate可用于每个引擎。