当前位置: 首页 > 知识库问答 >
问题:

在jupyter笔记本中使用joblib时不显示打印输出

令狐宏伟
2023-03-14

所以我使用joblib来并行化一些代码,我注意到在jupyter笔记本中使用它时无法打印东西。

我尝试在ipython中使用相同的示例,效果非常好。

下面是一个在jupyter笔记本电脑中写入的最小(非)工作示例

from joblib import Parallel, delayed
Parallel(n_jobs=8)(delayed(print)(i) for i in range(10))

所以我得到的输出为[无,无,无,无,无,无,无,无]但没有打印任何内容。

我期望看到的(打印顺序在现实中可能是随机的):

1
2
3
4
5
6
7
8
9
10
[None, None, None, None, None, None, None, None, None, None]

您可以在笔记本进程的日志中看到打印。但我希望打印发生在笔记本上,而不是笔记本过程的日志。

我已经打开了一个Github问题,但到目前为止关注最少。

共有2个答案

孟鹤龄
2023-03-14

在Z4 tier的git link中,scottgigante的方法在Windows中工作,但与指定的结果相反:在Jupyter笔记本中,“多处理”后端永远挂起,但默认的loky工作正常(python 3.8.5和notebook 6.1.1):

from joblib import Parallel, delayed
import sys
def g(x):
    stream = getattr(sys, "stdout")
    print("{}".format(x), file=stream)
    stream.flush()
    return x
Parallel(n_jobs=2)(delayed(g)(x**2) for x in range(5))

executed in 91ms, finished 11:17:25 2021-05-13
[0, 1, 4, 9, 16]

一种更简单的方法是在延迟中使用标识函数:

Parallel(n_jobs=2)(delayed(lambda y:y)([np.log(x),np.sin(x)]) for x in range(5))
executed in 151ms, finished 09:34:18 2021-05-17
[[-inf, 0.0],
 [0.0, 0.8414709848078965],
 [0.6931471805599453, 0.9092974268256817],
 [1.0986122886681098, 0.1411200080598672],
 [1.3862943611198906, -0.7568024953079282]]

或者像这样使用:

Parallel(n_jobs=2)(delayed(lambda y:[np.log(y),np.sin(y)])(x) for x in range(5))
executed in 589ms, finished 09:44:57 2021-05-17
[[-inf, 0.0],
 [0.0, 0.8414709848078965],
 [0.6931471805599453, 0.9092974268256817],
 [1.0986122886681098, 0.1411200080598672],
 [1.3862943611198906, -0.7568024953079282]]
方博学
2023-03-14

我认为这部分是由并行产生子工作人员的方式以及Jupyter Notebook如何为这些工作人员处理IO造成的。当在没有为backend指定值的情况下启动时,并行将默认为loky,它利用直接使用fork-exec模型来创建子进程的池化策略。

如果您从终端启动Notebook,则使用

$ jupyter-notebook

常规的stderr和stdout流似乎仍然连接到该终端,而笔记本会话将在新的浏览器窗口中启动。在笔记本中运行发布的代码片段确实会产生预期的输出,但它似乎会转到stdout,并最终出现在终端中(如问题注释所示)。这进一步支持了这样一种怀疑,即这种行为是由loky和notebook之间的交互以及notebook对子进程处理标准IO流的方式引起的。

这让我在github上进行了讨论(截至发帖前2周内活跃),笔记本的作者似乎意识到了这一点,但目前似乎没有明显的快速解决方案。

如果您不介意切换用于生成子级的并行后端,可以这样做:

from joblib import Parallel, delayed
Parallel(n_jobs=8, backend='multiprocessing')(delayed(print)(i) for i in range(10))

有了多处理后端,一切正常<代码>线程化看起来也很好。这可能不是您所希望的解决方案,但希望在笔记本作者努力寻找合适的解决方案时,这就足够了。

我会把这篇文章交叉发布到GitHub上,以防有人想补充这个答案(我不想误述任何人的意图,也不想把话塞进人们的嘴里!)。

测试环境:
MacOS-Mojave(10.14)
Python-3.7.3
pip3-19.3.1

在2种配置中测试。已确认在对后端html" target="_blank">参数同时使用多处理线程时产生预期输出。软件包使用pip3安装。

设置1:

ipykernel                               5.1.1
ipython                                 7.5.0
jupyter                                 1.0.0
jupyter-client                          5.2.4
jupyter-console                         6.0.0
jupyter-core                            4.4.0
notebook                                5.7.8

设置2:

ipykernel                               5.1.4
ipython                                 7.12.0
jupyter                                 1.0.0
jupyter-client                          5.3.4
jupyter-console                         6.1.0
jupyter-core                            4.6.2
notebook                                6.0.3

我也成功地使用了与“Setup 2”相同的版本,但笔记本电脑的软件包版本降级到了6.0.2。

这种方法在Windows上的工作不一致。软件版本的不同组合会产生不同的结果。做最直观的事情——将所有内容升级到最新版本——并不能保证它会起作用。

 类似资料:
  • 我正在学习Jupyter笔记本的降价单元格,并尝试使用以下代码为我的一本笔记本创建一个简单的深红色标题: 在Jupyter笔记本中,当我运行单元格时,这变成了一个深红色的标题,正如预期的那样,这里有一个大纲:http://datascience.ibm.com/blog/markdown-for-jupyter-notebooks-cheatsheet/. 当我将笔记本上传到GitHub时,我的J

  • 问题内容: 我正在尝试在Jupyter笔记本中使用进度条。这是一台新计算机,我通常无法正常工作: 产生以下文本输出,并且不显示任何进度条 同样,此代码: 产生以下文本输出: 我缺少让Jupyter显示这些进度条的设置吗? 问题答案: 答案在GitHub问题中。 关键是要确保使用以下命令启用笔记本扩展: 您还需要安装JupyterLab扩展: 编辑: 作为中提到的文档以及一些下面的意见,安装Jupy

  • 问题内容: 在IPython / Jupyter Notebook中运行的大多数语言内核的错误报告都指出发生错误的行;但是(至少默认情况下)在笔记本电脑中未显示行号。 是否可以将行号添加到IPython / Jupyter Notebook? 问题答案: -在CodeMirror区域中切换行号。有关其他键盘快捷键,请参见快速帮助。 详细信息- (或)将您带入命令模式,然后按键应切换当前单元格行号的

  • 我目前正在使用Jupyter笔记本,我想强制它将Python日志打印到输出单元格。 我用的是以前用这种方式工作的旧笔记本,可能是旧版本的Jupyter笔记本。 我将日志设置为: 但当我打电话时: 它不会在输出单元格中打印任何内容。它只是在我启动Jupyter笔记本的控制台中打印出内容。 我正在使用并且在我的虚拟环境中安装的包是: 单元格中的日志打印输出是否已更改?是否有某种方法可以强制将日志记录写

  • 我正在尝试使用joblib来并行化在函数上运行的循环。我希望显示函数的中间打印命令,而不仅仅是函数的返回值。 我得到以下输出: 我希望获得以下输出(或类似输出): 编辑:我刚刚注意到它确实会在启动Jupyter笔记本的终端窗口中打印我所需的输出。有没有关于如何在我的笔记本上打印的想法。提前谢谢。

  • 问题内容: 如何防止特定的情节显示在Jupyter笔记本中?我在笔记本中有几个绘图,但我希望将其中的一部分保存到文件中,而不要在笔记本上显示,因为这会大大降低速度。 Jupyter笔记本的最小工作示例是: 如您所见,我有两种图,a和b。我想绘制a并显示,而我不想b示,我只希望将它们保存在文件中。希望这会加快速度,并且不会用我不需要看到的数字污染笔记本。 感谢您的时间 问题答案: 也许只是清除轴,例