将代码分析工具引入Jupyter笔记本
基于对数千名机器学习从业者的调研,某中心推出新型CodeGuru扩展,专门解决代码单元执行顺序混乱、API调用错误及安全漏洞等常见问题。
计算笔记本的挑战
计算笔记本是基于实验室笔记本概念的交互式网页编程界面。用户可描述执行的计算(包括图表)并在笔记本中嵌入代码,后端会执行代码并将结果整合到笔记本布局中。Jupyter Notebook作为最流行的计算笔记本实现,已成为数据科学家的首选工具。截至2018年9月,GitHub上已有超过250万个公开Jupyter笔记本,且数量持续快速增长。
然而使用Jupyter Notebook会带来代码维护和机器学习最佳实践方面的多项挑战。近期对2669名机器学习从业者的调研显示:33%认为笔记本因混合代码、文档和可视化内容而易变得混乱;23%发现静默错误难以检测;18%认为全局变量使用不一致;15%认为笔记本复现困难;6%难以检测和修复安全漏洞。
静态分析解决方案
传统软件开发环境常用静态分析工具识别预防错误并强制执行编码标准,但Jupyter笔记本长期缺乏此类工具。某中心CodeGuru团队为适应笔记本环境,将现有工具改造为针对性解决方案。
在2023年3月第25届形式方法国际研讨会上发表的论文中,通过调研和访谈明确了笔记本环境需解决的具体问题。以下展示两项提升机器学习专家效率的新技术:
执行顺序问题
代码以代码单元形式嵌入计算笔记本,可按任意顺序执行并实时编辑——即其他单元执行后仍可增删改代码单元。虽然这种灵活性有利于数据探索,但会导致可重现性问题:共享变量的单元在不同执行顺序下可能产生不同结果。
代码单元执行后会在左侧方括号内分配执行计数,表示其在执行顺序中的位置。当代码单元以非线性顺序执行时,可能出现执行计数缺失(如执行后删除或重复执行),导致他人难以复现相同结果。
为解决该问题,开发了动态信息捕获与静态分析相结合的混合方法。工具在执行期间收集动态信息,将含Python代码单元的笔记本文件转换为新型Python表示,该表示既建模执行顺序也建模代码单元本身。基于此模型,可利用Python静态分析引擎设计新规则来发现问题。
API误用问题
笔记本用户另一常见问题是误用机器学习API。PyTorch、TensorFlow和Keras等流行机器学习库极大简化了AI系统开发,但由于领域复杂性、库的高抽象度及函数约定晦涩,用户常误用API并在不知情时注入错误。
以下代码展示典型误用:神经网络某些层(如dropout层)在训练和评估阶段行为不同。PyTorch要求显式调用train()和eval()分别表示训练和评估开始。示例代码本应从磁盘加载训练模型并在测试数据上评估,但缺少eval()调用(默认所有模型处于训练阶段),导致某些层间接改变网络架构,使所有预测不稳定——同一输入在不同时间会产生不同预测。
|
|
此类错误导致的不稳定性可能产生严重影响。即使发现并修复错误(目前通过人工代码审查),模型仍需重新训练。根据模型大小和错误发现阶段,可能浪费数千小时。最佳方案是在开发者编写代码后立即检测错误,静态分析可助力实现。论文中实现了一套静态分析规则,自动分析Jupyter笔记本中的机器学习代码,并能高精度检测此类错误。
在大规模笔记本文件实验中,平均每7个笔记本可发现1个错误。该结果推动了对Jupyter笔记本错误检测的深入研究。
用户关注的核心问题
调研识别出笔记本用户关注的五大问题:
- 可重现性:14%受访者仅在模型需投入生产时才与他人协作,生产笔记本的可重现性更为关键
- 正确性:23%受访者确认使用机器学习库时会引入影响模型输出但不会导致程序崩溃的静默正确性错误
- 可读性:32%受访者认为可读性是使用笔记本的最大难点,杂乱的笔记本阻碍维护与协作
- 性能:大规模模型训练耗时耗内存,用户需要提升训练和运行时执行效率
- 安全性:34%受访者指出ML从业者安全意识薄弱,需安全扫描。笔记本常依赖外部代码和数据,易受代码注入和数据投毒攻击
这些发现指引了分析规则的设计方向。在规则采集和规范阶段,征求了ML专家对规则实用性的反馈以及合规/非合规案例示例。规则开发后,邀请ML专家在真实笔记本上评估工具,并根据反馈提升规则准确性。
新推出的JupyterLab和SageMaker Studio扩展支持在计算笔记本中实施代码质量和安全"左移"(开发流程早期介入)。用户现可检测笔记本单元内的安全漏洞(如注入缺陷、数据泄漏、弱加密和缺失加密)以及影响可读性、可重现性和计算正确性的其他常见问题。