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

Jul*_*ore 12 python windows jupyter-notebook tensorboard jupyter-lab

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

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

%tensorboard --logdir {logdir}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

tensorboard_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1) # logdir is the full path
Run Code Online (Sandbox Code Playgroud)

但是如果我能在笔记本中可靠地启动 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)
Run Code Online (Sandbox Code Playgroud)

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

%tensorboard --logdir {logdir}
Run Code Online (Sandbox Code Playgroud)

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

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

我做错了什么,如何完全重置张量板?

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

%tensorboard --logdir {makeWindowsCmdPath('A:\\tensorboard\\20200102-112749')}
Run Code Online (Sandbox Code Playgroud)

其中 makeWindowsCmdPath 定义为

def makeWindowsCmdPath(path):
    return '\"' + str(path) + '\"'
Run Code Online (Sandbox Code Playgroud)

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

wch*_*gin 17

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

我如何以 $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 实例执行一些清理其他实例在开始时间。我们还没有开始实施这些。

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

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