42

我目前正在使用 jupyter notebook 在远程服务器上训练神经网络。我设置了以下内容:

  • 多路复用器
  • jupyter-notebook --no-browser --port=5000
  • 使用浏览器连接到 jupyter notebook 并执行单元格进行训练(前 10 分钟的输出很好)
  • 分离 tmux (ctrl-b, d) 并关闭浏览器选项卡

现在,当我在浏览器中重新连接到 jupyter notebook 时,我看不到训练单元的当前输出,只有我在观看前 10 分钟训练时看到的输出。

我试图为此找到解决方案,我认为,对于这个特定问题存在一些 git 问题,但它们很旧,我无法弄清楚这个问题是否已解决。

编辑// 使我的意图更清楚,因为我在 StackOverflow 上发现了一些正在解决这个问题的线程:我不想等待训练完成,因为我可能想在训练完成之前终止训练,当它绝对不会按照我期望的方式进行。因此,某种“实时”输出或至少是常规输出会很好。

4

4 回答 4

1

如果您使用 .py 文件而不是 .ipynb 文件(jupyter notebook),并且在此 .py 文件中打印结果以测试代码的操作。

要从 .ipynb 转换为 .py 文件,您可以使用以下命令:

'jupyter nbconvert --to script example.ipynb'

现在,您可以使用 python 脚本而不是 jupyter 笔记本文件,这将使事情变得更容易。

在您的脚本中,在您认为必要的阶段编写 prints(),以便您可以在 Tmux 终端中看到它。所以你可以随时终止你的训练 (ctr+c)

于 2021-01-06T01:48:50.680 回答
0

我目前面临同样的问题,我发现了这个讨论。提到的Papermill工作得很好。只需使用类似的东西:

nohup papermill --request-save-on-cell-execute --no-progress-bar input.ipynb output.ipynb &

input.ipnb带有源代码的笔记本。

output.ipnb处理后的笔记本,您可以在其中看到输出。

--request-save-on-cell-execute单元格完成后将单元格输出打印到output.ipnb笔记本中。

--no-progress-bar如果您在一个单元格中完成所有工作,则禁用显示进度条,这是非常无用的。

nohup$从服务器注销并在后台执行后,是否有造纸厂继续运行。

在那里可以找到所有 Papermill 选项。

于 2021-08-16T19:28:02.440 回答
0

这是 Jupiter Notebook 官网中的一个尚未解决的问题。请参阅https://github.com/jupyterlab/jupyterlab/issues/2833 “重新连接到正在运行的会话:保持输出”

于 2021-03-26T04:46:58.163 回答
0

这是 jupyter 笔记本中长期缺少的功能。我使用几乎相同的设置:我的笔记本在远程服务器的 tmux 会话中运行,我在本地使用 ssh 隧道。

在做任何工作之前,我在第一个单元格中运行以下代码段:

import sys
import logging

nblog = open("nb.log", "a+")
sys.stdout.echo = nblog
sys.stderr.echo = nblog

get_ipython().log.handlers[0].stream = nblog
get_ipython().log.setLevel(logging.INFO)

%autosave 5

现在假设,我运行一个需要一段时间才能完成的单元(如训练运行)。就像是:

import time

def train(num_epochs):
    for epoch in range(num_epochs):
        time.sleep(1)
        print(f"Completed epoch {epoch}")

train(1000)

现在train(1000)正在运行,在前 10 秒后,我想做其他事情并关闭浏览器,并断开我的远程连接。

(注意修改后的短自动保存持续时间;我补充说,因为我经常忘记在关闭浏览器选项卡之前保存笔记本。)

500 秒过去后,我可以重新连接到远程服务器并在浏览器中打开笔记本。我的这个单元格的日志将在“完成 epoch 9”之后停止打印,即当我断开连接时。但是,内核实际上仍会train在后端运行,并且还会显示“忙碌”。

我们现在可以简单地打开文件nb.log,我们会找到所有日志,包括我们关闭浏览器和连接后的日志。我们可以在闲暇时不断刷新nb.log文件,新的日志会不断出现,直到内核完成运行train()

现在如果我们想train()在它完成之前停止,我们可以在 jupyter 中按下中断按钮。内核将被释放,我们可以运行其他东西(并且键盘中断错误消息也将显示在您的 nb.log 文件中)。我们所有预先计算的笔记本变量和导入的库仍然存在,因为内核实际上并没有断开连接。

虽然这不是一个非常复杂的解决方案,但我发现它很容易实现

于 2022-02-12T23:16:54.167 回答