重新连接远程Jupyter Notebook并获取当前单元格输出

The*_*ude 14 jupyter-notebook

我目前正在使用jupyter笔记本在远程服务器上训练神经网络.我用以下内容进行了设置:

  • TMUX
  • jupyter-notebook --no-browser --port = 5000
  • 使用浏览器连接到jupyter笔记本并执行训练单元(我在前10分钟观看时输出正常)
  • 分离tmux(ctrl-b,d)并关闭浏览器选项卡

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

我试图为此找到一个解决方案,我认为,对于这个问题存在一些git问题,但它们已经过时了,我无法弄清楚这个问题是否已经解决.

编辑//让我的意图更加清晰,因为我发现stackoverflow上的一些线程正在解决这个问题:我不想等待训练完成,因为我可能想要在它完成之前杀死训练,当它绝对我不希望它会走的路.因此,某种"实时"输出或至少是常规输出会很好.

Mer*_*ury 11

这是 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
Run Code Online (Sandbox Code Playgroud)

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

import time

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

train(1000)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

  • 好的,找到了“HuggingFace”进度表更新的解决方法。只需配置回调 `log_callback = PrinterCallback()`、`trainer.add_callback(log_callback)`,在 `TrainingArguments` 中设置 `logging_strategy='epoch'`,然后从 [本示例] 复制 `PrinterCallback()` 的实现(https://huggingface.co/docs/transformers/v4.19.2/en/main_classes/callback#transformers.TrainerCallback.example)。感谢@Mercury 的解决方案,输出将被重定向到“nb.log”文件。 (2认同)

lig*_*and 5

这是 Jupiter Notebook 官方网站上仍然悬而未决的问题。请参阅https://github.com/jupyterlab/jupyterlab/issues/2833 “重新连接到正在运行的会话:保留输出”


Arm*_*.Py 1

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

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

'jupyter nbconvert --to script example.ipynb'
Run Code Online (Sandbox Code Playgroud)

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

在您的脚本中,在您认为必要的阶段编写 prints() ,以便您可以在 Tmux 终端中看到它。因此,您可以随时 (ctr+c) 终止训练,如果需要,Tmux 可以保存会话,只需按“ctr-b + d”即可从会话中分离