尝试重用已终止的 Windows PID 时如何重置 Tensorboard

Posted

技术标签:

【中文标题】尝试重用已终止的 Windows PID 时如何重置 Tensorboard【英文标题】:How to reset Tensorboard when it tries to reuse a killed Windows PID 【发布时间】:2020-04-21 02:23:55 【问题描述】:

如果两天的挫败感泄露出去,我们深表歉意……

问题:无法在 jupyter notebook 中可靠地运行 Tensorboard(实际上是在 Jupyter Lab 中)

%tensorboard --logdir logdir

如果我终止 tensorboard 进程并在笔记本中重新启动,它会说它正在重用死进程和端口,但进程已经死了并且 netstat -ano | findstr :6006` 什么都没有显示,所以端口看起来也关闭了。

问题:我如何以 $deity 的名义让 tensorboard 从头开始​​重新启动并忘记它认为自己知道的进程、端口等信息?如果我能做到这一点,我可以解决残留路径等问题......

已解决的已知问题(我认为:需要转义 Python 字符串中的反斜杠以获得正确的路径和其他操作系统小问题;避免路径中的空格,确保正确的大小写...

环境:Win 64-bit Home,通过 conda install 安装 Anaconda 和 Tensforflow-GPU 2 - TF 正在工作并将数据写入通过回调给出的指定路径

tensorboard_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1) # logdir is the full path

但如果我能在 notebook 中可靠地启动 Tensorboard,那我该死。

我发现如果我启动 Anaconda 命令窗口并从那里调用 tensorboard,则 tensorboard 启动正常...

(TF2GPU_Anaconda) C:\Users\Julian>tensorboard --logdir "a:\tensorboard\20200102-112749"
2020-01-02 11:53:58.478848: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.0.0 at http://localhost:6006/ (Press CTRL+C to quit)

它可以在 localhost:6006 的 Chrome 中访问,如所述(特别是 http://localhost:6006/#scalars&run=20200102-112749%5Ctrain)(我将忽略 tensorboard 的 other 问题,例如标量刷新失败、图形上的奇怪消息等.)

%tensorboard --logdir logdir

然后在笔记本和单独的 chrome 选项卡中显示 tensorboard。

但是!虽然 tensorboard 在笔记本中报告它正在重用旧的死 PID,但实际上它是在一个完全不同的新 PID 上

我做错了什么,如何完全重置 tensorboard?

PS最后一次(成功!)调用实际上是用

%tensorboard --logdir makeWindowsCmdPath('A:\\tensorboard\\20200102-112749')

makeWindowsCmdPath 定义为

def makeWindowsCmdPath(path):
    return '\"' + str(path) + '\"'

更新 2020-01-03 最终成功的 MWE 已在 Github 的评论中上传,以回应包括 tensorboard 的 PID 引用错误的问题

【问题讨论】:

【参考方案1】:

嘿—很抱歉听到您遇到问题。完全是 你所描述的一切都是准确的和我的,这似乎是合理的 过错。 :-)

我如何以 $deity 的名义让 tensorboard 从头开始​​重新启动 忘记了它认为自己对进程、端口等的了解?如果我 可以做到这一点,我可以解决剩余路径等问题...

在您的临时目录中有一个名为.tensorboard-info 的目录 它维护着我们的 TensorBoard 作业的尽力而为的注册表 认为正在运行。当 TensorBoard 启动时(以任何方式,包括 使用%tensorboard),它将一个“信息文件”写入该目录,并且 当您使用%tensorboard 时,我们首先检查是否“兼容 实例”(相同的工作目录和 CLI 参数)仍在运行,如果 所以重用它。当一个 TensorBoard 实例干净地关闭时,它 删除自己的信息文件。这个想法是,只要 TensorBoard 是 干净地关闭我们应该始终准确记录哪些 进程是实时的,并且由于此注册表位于临时目录中 由于硬关机导致的错误将是短暂的。

但这就是我犯错的地方:来自 POSIX 世界而不是 非常熟悉Windows应用程序开发,我没有意识到 Windows 临时目录实际上并没有被自动删除, 曾经。因此,任何记账错误都会无限期地持续存在。

因此,您的问题的答案是,“删除 .tensorboard-info 位于tempfile.gettempdir() 下的目录”(最好是当您 没有任何正在运行的 TensorBoard 实例)。

我们可以通过一些方法在 TensorBoard 中合理地解决这个问题 核心:见https://github.com/tensorflow/tensorboard/issues/2483 开始,我也考虑过摊销方法,比如让每个 TensorBoard 实例在启动时对其他实例执行一些清理 时间。我们还没有开始实施这些。

让我知道这是否有帮助或无法解决您的问题。

【讨论】:

忏悔对灵魂有好处——它让我微笑:我想这是我第一次看到“啊,是的。我的错”。回复像张量*这样“大”的东西。 tempfile.getttempdir() ??无论如何,在 C:\Users\username\AppData\Local\Temp\.tensorboard-info 找到了 .info 文件,因此现在可以管理它们。 TB 启动时的一项明显检查:声明的 PID 存在于 TB 可执行 cmd 路径中。问题完全回答!谢谢你 - 也为所有的好东西。

以上是关于尝试重用已终止的 Windows PID 时如何重置 Tensorboard的主要内容,如果未能解决你的问题,请参考以下文章

Windows 寻找占用端口的程序并终止该程序

当应用程序处于终止模式时,如何从推送通知重定向到特定的视图控制器

PyQt:如何终止可重用的 QThread

进程控制孤儿进程和僵尸进程

windows 根据端口查看进行PID 并杀掉进程

如何防止WINDOWS服务被终止或被禁用?