当前位置: 首页 > 科技观察

有了这个工具,不用执行代码

时间:2023-03-20 23:18:03 科技观察

就能发现PyTorch模型错误,扫码几秒,比再训练一遍发现要快很多。张量形状不匹配是深度神经网络机器学习过程中可能发生的重要错误之一。由于神经网络训练昂贵且耗时,因此在执行代码之前运行静态分析比执行然后发现错误要快得多。由于静态分析是在不运行代码的情况下进行的,因此可以帮助软件开发人员和质量保证人员发现代码中的结构错误和安全漏洞等问题,从而保证软件的整体质量。与程序动态分析相比,静态分析具有不实际执行程序的特点;执行速度快,效率高,因此受到研究人员的广泛青睐。目前可供研究的分析工具有很多,如斯坦福大学开发的Meta-Compilation(Coverity)、利物浦大学开发的LDRATestbed等。近日,韩国首尔国立大学的研究人员提出了另一种静态分析器,PyTea,可以自动检测PyTorch项目中的张量形状错误。包括PyTorch存储库和StackOverflow在内的项目存在对张量错误代码的测试。事实证明,PyTea可以在几秒钟内成功检测出这些代码中的张量形状错误。论文地址:https://arxiv.org/pdf/2112.09037.pdf项目地址:https://github.com/ropas/pytea几秒后,你就能找到张量形状错误的PyTea。PyTea工具可以静态扫描PyTorch程序并检测可能的形状错误。PyTea通过额外的数据处理和混合库(例如Torchvision、NumPy、PIL)分析真实世界Python/PyTorch应用程序的完整训练和评估路径。PyTea是这样工作的:给定一个输入PyTorch源,PyTea静态地跟踪每个可能的执行路径,收集路径上张量操作序列所需的张量形状约束,并决定是否满足约束(因此形状错误)。具体来说:如下图所示,PyTea首先将原始的Python代码翻译成一种内核语言,即PyTeaInternalRepresentation(PyTeaIR)。然后,它跟踪转换后的IR的每条可能执行路径,并收集对张量形状的约束,这些约束指示代码可以在没有形状错误的情况下运行的条件。PyTea将收集到的约束集提供给SMT(可满足性模理论)求解器Z3,以判断这些约束对于每个可能的输入形状都是可满足的。根据求解器结果,PyTea得出哪些路径包含形状错误。如果Z3的约束求解花费太多时间,PyTea将以“不知道”提示停止。PyTea的整体结构。PyTea包含两个分析器,在线分析器:node.js(TypeScript/JavaScript);离线分析器:Z3/Python。在线分析器:查找基于数字范围的形状不匹配和API参数的滥用。如果PyTea在分析代码时发现任何错误,它会停在那里并通知用户错误和约束违规;离线分析器:生成的约束被传递给Z3。Z3将解决每条路径的约束集并打印第一个违反的约束(如果有)。先看结果展示,在线分析器发现错误:离线分析器发现错误:IR等,让读者更好的了解执行过程。首先是PyTorch程序结构。PyTorch、TensorFlow和Keras等现代机器学习框架需要使用PythonAPI来构建神经网络。使用此类框架训练神经网络主要遵循以下四个阶段的标准程序。PyTorch中常规神经网络训练代码的结构。训练模型需要先定义网络结构。图2是摘自官方PyTorchMNIST分类示例的简化图像分类代码:这里,上面的代码首先定义了一系列神经网络层,并使它们成为一个单一的神经网络模块。为了正确组装一个层,上一层返回的张量必须满足下一层的输入要求。网络使用超参数的初始化参数实例化,例如隐藏层的数量。接下来,对输入数据集进行预处理并根据网络要求进行调整。从这个阶段开始,每个数据集都被切割成更小的等大小块(小批量)。最后,主循环开始,小批量按顺序输入网络。一个epoch是指将整个数据集传递给网络的单个循环,epoch的数量通常取决于神经网络的目的和结构。除了取决于数据集大小的主训练循环之外,训练代码中的迭代次数在大多数情况下被确定为常数,包括epoch的数量。在构建模型时,网络层之间的输入和输出张量形状不匹配是错误的张量形状。形状错误通常很难手动发现,只能通过使用实际输入运行程序来检测。下图是一个典型的tensorshapeerror(图2的简单修改),不仔细看是找不到错误的:对于tensorshapeerror(如上图中的错误类型),PyTea将原始Python代码翻译成PyTeaIR进行搜索,下图是PyTeaIR的一个例子:如上所述,PyTea会跟踪转换后的IR的每一个可能的执行路径,并收集相关的张量形状约束。约束是PyTorch应用程序为了在没有任何张量形状错误的情况下执行它所需要的。例如,矩阵乘法运算的两个操作数必须共享相同的维度。约束抽象语法如下图:约束抽象语法截图如何使用PyTea一、安装环境要求:node.js>=12.x,python>=3.8,z3-solver>=4.8。安装使用请参考以下代码:#installnode.jssudoapt-getinstallnodejs#installpythonz3-solverpipinstallz3-solver#downloadpyteawgethttps://github.com/ropas/pytea/releases/download/v0.1.0/pytea.zipunzippytea.zip#runpyteapythonbin/pytea.pypath/to/source.py#runexamplefilepythonbin/pytea.pypackages/pytea/pytest/basics/scratch.py??编译代码:#installdependenciesnpmruninstall:allpipinstallz3-solver#buildnpmrunbuild网友纷纷表示:这个工具绝对必要!