在代码开发过程中经常会遇到某段代码的运行结果与预期不符的情况,此时,除多遍阅读代码以外,增加调试级别的日志,并使用在线调试实时查看各变量值和流程跳转,可以帮助您快速定位问题。本文以排查DSW中提供的Sample Notebook问题为例,介绍如何通过DSW中的WebIDE,在线调试Notebook中运行的Python代码。
背景信息
DSW官方Demo提供了几个PAI AutoML超参调优示例,其中“AutoML超参调优入门”示例在运行到tuner.fit()
时经常卡顿,Notebook单元格输出日志如下图所示。从日志中直接找到问题根源比较困难,可以先查看tuner的实现代码,再进行代码调试。查看tuner实现代码的方法如下:
查看tuner对应Class的定义所在位置。
如下图所示。tuner对应的Class AutoTuner定义在名称为pai.automl.hpo的Python包中。
通过搜索找到代码在DSW实例中的安装路径(例如/home/admin/.local/lib/python3.6/site-packages/pai/automl),并将其作为项目在WebIDE中打开,如下图所示。
程序代码比较多,没有时间搞清楚所有逻辑流程,只是希望增加一个debugger并在关键点设置断点,从而快速找到问题所在。DSW中的WebIDE可以调试本地或远程运行的程序,如果程序在WebIDE之外执行,则需要在待调试程序中增加ptvsd监听代码,暂停执行直到有debugger attach。本文的目标即是在JupyterLab中运行该Sample Notebook时,能够从WebIDE中远程连接并单步跟踪程序运行。
操作步骤
在被调试代码中增加ptvsd instrumentation。
可选:如果未安装ptvsd,需要执行如下命令进行安装。
pip install --upgade ptvsd
在待调试的代码中增加如下代码。
import ptvsd print("Waiting for debugger attach") # Allow other computers to attach to ptvsd at this IP address and port. ptvsd.enable_attach(address=('192.0.2.1', 3000), redirect_output=True) # Pause the program until a remote debugger is attached ptvsd.wait_for_attach()
其中
192.0.2.1
指代码运行的服务器IP地址,3000
指debugger监听端口。针对本文排查的问题,在WebIDE中修改/home/admin/.local/lib/python3.6/site-packages/pai/automl/hpo/autotuner.py,改动后的代码如下图所示。返回至JupyterLab中,重新运行该Sample Notebook,其运行结果如下图所示。
系统在
tunner.fit()
单元格下方输出Waiting for debugger attach
,表示远程debugger设置已生效。
在WebIDE中,debugger远程连接ptvsd。
ptvsd在远程端等待debugger连接,必须在WebIDE debugger中设置相应的参数才能正常工作。具体来讲,即在项目路径下的.vscode/launch.json文件中增加如下配置。其中的几个关键设置包括:
host:由于本示例中的debugger与被调试程序在同一台服务器,因此将host设置为localhost。
port:因为必须与ptvsd等待连接的端口保持一致,所以将port设置为3000。
justMyCode:必须设置为false,否则断点不生效。
- 本页导读 (1)