基于对数千名机器学习从业者的调查,一款新的CodeGuru扩展旨在解决常见问题,如代码单元执行顺序、错误的API调用以及安全问题。
基于对数千名机器学习从业者的调查,一款新的CodeGuru扩展旨在解决常见问题,如代码单元执行顺序、错误的API调用以及安全问题。
计算笔记本是一种基于实验笔记本概念的交互式、基于Web的编程界面。用户可以在笔记本中描述他们正在进行的计算(包括图表)并嵌入代码,笔记本后端将执行代码,并将结果集成到笔记本布局中。Jupyter Notebook是计算笔记本最流行的实现,并已成为数据科学家的首选工具。截至2018年9月,GitHub上已有超过250万个公共Jupyter笔记本,且这个数字还在快速增长。
然而,使用Jupyter Notebook在代码维护和机器学习最佳实践方面带来了一些挑战。我们最近调查了2669名机器学习从业者,其中33%的人提到,由于代码、文档和可视化内容的混合,笔记本很容易变得杂乱无章。同样,23%的人发现静默错误难以检测,18%的人认为全局变量的使用不一致。另有15%的人发现复现笔记本很困难,6%的人在检测和修复笔记本中的安全漏洞方面遇到困难。
我们很高兴分享最近为JupyterLab和SageMaker Studio推出的Amazon CodeGuru扩展。该扩展与JupyterLab和SageMaker Studio无缝集成,只需单击一个按钮,即可为用户提供反馈和改进代码质量与安全性的建议。
传统软件开发环境通常使用静态分析工具来识别和防止错误并强制执行编码标准,但Jupyter笔记本目前缺乏此类工具。我们在Amazon CodeGuru团队(为某机构客户开发了一系列代码分析工具)看到了一个绝佳的机会,可以调整我们现有的工具以适应笔记本,并构建最适合这个新问题领域的解决方案。
我们在2023年3月举行的第25届国际形式化方法研讨会上发表的一篇论文中介绍了初步工作。该论文报告了我们的调查以及对机器学习从业者的访谈所得出的见解,以了解在笔记本上下文中需要解决哪些具体问题。下面,我们举例说明我们的新技术如何帮助机器学习专家提高工作效率。
代码嵌入在笔记本的代码单元中,这些单元可以按任意顺序执行并即时编辑;也就是说,可以在其他单元执行后添加、删除或更改单元。
虽然这种灵活性对于探索数据非常有用,但它带来了可复现性问题,因为共享变量的单元在不同顺序运行时可能产生不同的结果。
一旦代码单元被执行,其左侧方括号中就会分配一个整数,称为执行计数,表示该单元在执行顺序中的位置。在上面的例子中,当代码单元以非线性顺序执行时,变量 z 的最终值为6。然而,执行计数2在笔记本文件中缺失,这可能是由多种原因造成的:可能是该单元被执行后又被删除,或者某个单元被执行了两次。无论如何,另一个人很难复现出相同的结果。
为了捕捉Jupyter笔记本中因无序执行导致的问题,我们开发了一种结合动态信息捕获和静态分析的混合方法。我们的工具在笔记本执行期间收集动态信息,然后将带有Python代码单元的笔记本文件转换为一种新颖的Python表示形式,该形式既模拟了执行顺序,也模拟了代码单元本身。基于此模型,我们能够利用Python静态分析引擎并设计新的静态分析规则来捕捉笔记本中的问题。
笔记本用户的另一个常见问题是滥用机器学习API。流行的机器学习库(如PyTorch、TensorFlow和Keras)极大地简化了AI系统的开发。然而,由于该领域的复杂性、库的高度抽象性以及控制库函数的有时晦涩的约定,库用户经常误用这些API,并在不知不觉中将错误引入笔记本。
以下代码展示了这样一种误用。神经网络的某些层(如Dropout层)在网络的训练和评估阶段可能表现不同。PyTorch要求显式调用 train() 和 eval() 来分别表示训练和评估的开始。代码示例旨在从磁盘加载一个已训练的模型并在一些测试数据上对其进行评估。
但是,它缺少对 eval() 的调用,因为默认情况下,每个模型都处于训练阶段。在这种情况下,某些层将间接改变网络的架构,这将使所有预测不稳定;即,对于相同的输入,预测结果在不同时间会有所不同。
# 不合规案例
model.load_state_dict(torch.load("model.pth"))
predicted = model.evaluate_on(test_data)
# 合规案例
model.load_state_dict(torch.load("model.pth"))
model.eval()
predicted = model.evaluate_on(test_data)由该错误引起的不稳定性可能会产生严重影响。即使在发现错误(目前通过手动代码审查)并修复后,模型也需要重新训练。根据模型的大小以及发现错误的时间点,这可能意味着浪费数千小时。
最好的情况是在开发者编写代码后立即检测到错误。静态分析可以帮助实现这一点。在我们的论文中,我们实现了一组静态分析规则,可以自动分析Jupyter笔记本中的机器学习代码,并能高精度地检测此类错误。
在涉及大量笔记本文件的实验中,我们的规则平均每七个笔记本就发现一个错误。这一结果激励我们深入研究Jupyter笔记本中的错误检测。
我们的调查确定了笔记本用户关心的以下问题:
这些发现为我们新的分析规则应解决的问题指明了方向。在规则来源和规范阶段,我们征求了机器学习专家对规则有用性的反馈,以及说明规则的合规和不合规案例。在开发规则后,我们邀请了一组机器学习专家在真实世界的笔记本上评估我们的工具。我们利用他们的反馈来提高规则的准确性。新推出的用于JupyterLab和SageMaker Studio的Amazon CodeGuru扩展使得在计算笔记本中执行代码质量和安全性的“左移”(即在开发过程早期进行)成为可能。用户现在可以检测笔记本单元内的安全漏洞(如注入缺陷、数据泄露、弱加密和缺失加密),以及其他影响笔记本执行计算的可读性、可复现性和正确性的常见问题。
致谢: Martin Schäf,Omer TrippFINISHED
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。