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