如何调试垂死的 Jupyter Python3 内核?
Posted
技术标签:
【中文标题】如何调试垂死的 Jupyter Python3 内核?【英文标题】:How to debug dying Jupyter Python3 kernel? 【发布时间】:2017-01-12 17:02:44 【问题描述】:我正在使用 Python 3 内核在 Jupyter notebook 上使用 scipy 和 scikits.learn 运行一些代码。在计算过程中,内核正在重新启动,并显示一条消息对话框,说“内核似乎已经死了。它将自动重新启动。”。底层 Jupyter 进程的 stderr 只记录内核死机并且将在没有任何有用消息的情况下重新启动的事实。 有没有办法检查潜在的错误?这可能是来自某些 C++ 代码的段错误,但我只能猜测。我在服务器上搜索了任何相关日志,但没有找到任何有用的信息。
【问题讨论】:
您可以逐字发布任何代码/错误消息吗? 这是个好问题。有几十个 SO 问题描述了用户的环境以及内核死时他们在做什么。但发布的答案只是猜测。如何确定发生了什么? 也许您可以将笔记本保存为 python 文件并尝试运行它以查看会发生什么。 您能描述一下您的系统吗?你能找到一个核心文件吗?我已经使用 GDB 在 Linux 上解决了类似的问题,但如果您使用的是不同的操作系统,这样的答案可能不太有用。在我的例子中,当一个特定的文件丢失时,一个 C++ 库实际上是在调用 exit(1)。 很抱歉,但我现在不能确定(或者在 2017 年发布有关代码的问题时)我在 2016 年跑回了哪一部分。肯定是一个使用 scikits.learn 在多种变体中进行层次聚类的脚本,以找到适合外部约束的聚类,但现在无法确定它是哪一部分。错误信息只是上面引用的,没有更多。 【参考方案1】:在机器学习项目中,在 8 gigs RAM 笔记本电脑中读取近 5000 张图像作为 numpy 数组时遇到了完全相同的问题。在对图像的分辨率、相应的 numpy 数组的大小进行了一些数学运算后,我发现 8 gigs 的 RAM 不足以处理图像。 在网上进行了大量研究后,包括更新 CUDA、cuDNN、降级 TensorFlow(他们在导入相关模块/包时遇到同样的错误)等建议,将 numpy 更新到最新版本并更新 intel Math Kernel 版本(命令:“conda install -c intel mkl”)(一整天的研究)。 对我有用的解决方案是在 Google colab 上运行模型训练过程。
现在,回到您的问题: 显示的对话框:“内核似乎已经死了。它会自动重启。”本身不是“错误”。它更像是通过清除所有变量并重新启动内核来“帮助自己的 Jupyter Notebook”。它是 Jupyter Notebook 发送 SOS 信号,并从自身获得帮助,使其不会崩溃。否则会导致重新启动的 Jupyter Notebook 没有未保存的更改。 (嗯,它会自动保存,但不会“自动检查点”)
Jupyter Notebook 的这种“响应”仅仅是因为达到了笔记本电脑的最大 RAM 容量。 - 这是“潜在错误”(响应)。这将释放资源,使您能够重新启动程序。 还记得当您打开太多 chrome 标签时您的计算机挂起吗?或者运行一个需要存储太多变量值的程序(比如我的 5000 张图像案例)?当 RAM 容量被充分利用时,这可能是 Jupyter Notebook 的替代响应。绞刑。或者崩溃。
但相反,开发人员已经足够友善,使其能够自行处理。
注意1:运行与.py脚本相同的代码,错误会更详细。
注意2:如果您使用的是 CUDA,请记住即使会话终止,Jupyter Notebook 也无法释放 CUDA 资源。所以这可能是它重新启动的原因。
【讨论】:
“运行与 .py 脚本相同的代码,错误会更冗长”是我的关键部分,导致我找到了next rabbit hole ?【参考方案2】:添加到已确认的解释列表(第 2 点):
-
需要太多内存
堆栈溢出 - 递归步骤过多
在我的例子中,当我将它作为 Python 脚本运行时,我得到了这个:
致命的 Python 错误:无法从堆栈溢出中恢复。 ... 中止(核心转储)
【讨论】:
以上是关于如何调试垂死的 Jupyter Python3 内核?的主要内容,如果未能解决你的问题,请参考以下文章
python3工作环境部署+spyder3+jupyter notebook