资源分享 | PyTea:不用运行代码,静态分析pytorch模型的错误
前言
本文介绍一个Pytorch模型的静态分析器 PyTea,它不需要运行代码,即可在几秒钟之内扫描分析出模型中的张量形状错误。文末附使用方法。
本文转载自机器之心
编辑:CV技术指南
关注公众号CV技术指南 ,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读。
张量形状不匹配是深度神经网络机器学习过程中会出现的重要错误之一。由于神经网络训练成本较高且耗时,在执行代码之前运行静态分析,要比执行然后发现错误快上很多。
由于静态分析是在不运行代码的前提下进行的,因此可以帮助软件开发人员、质量保证人员查找代码中存在的结构性错误、安全漏洞等问题,从而保证软件的整体质量。
相比于程序动态分析,静态分析具有不实际执行程序;执行速度快、效率高等特点而广受研究者青睐,目前,已有许多分析工具可供研究使用,如斯坦福大学开发的 Meta-Compilation(Coverity)、利物浦大学开发的 LDRA Testbed 等。
近日,来自韩国首尔大学的研究者们提出了另一种静态分析器 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 代码翻译成一种内核语言,即 PyTea 内部表示(PyTea IR)。然后,它跟踪转换后的 IR 的每个可能执行路径,并收集有关张量形状的约束,这些约束规定了代码在没有形状错误的情况下运行的条件。 PyTea 将收集到的约束集提供给 SMT(Satisfiability Modulo Theories)求解器 Z3,以判断这些约束对于每个可能的输入形状都是可满足的。根据求解器的结果,PyTea 会得出结论,哪条路径包含形状错误。如果 Z3 的约束求解花费太多时间,PyTea 会停止并发出「don’t know」提示。
PyTea 的整体结构。
PyTea 由两个分析器组成,在线分析器:node.js (TypeScript / JavaScript);离线分析器:Z3 / Python。
在线分析器:查找基于数值范围的形状不匹配和 API 参数的滥用。如果 PyTea 在分析代码时发现任何错误,它将停在该位置并将错误和违反约束通知用户;
离线分析器:生成的约束传递给 Z3 。Z3 将求解每个路径的约束集并打印第一个违反的约束(如果存在)。
我们先来看下结果展示,在线分析器发现错误:

离线分析器发现错误:

为了更好的理解 PyTea 执行静态分析过程,下面我们介绍一下主要的技术细节,包括 PyTorch 程序结构、张量形状错误、PyTea IR 等,以便读者更好的理解执行过程。
首先是 PyTorch 程序结构,PyTorch、TensorFlow 和 Keras 等现代机器学习框架需要使用 Python API 来构建神经网络。使用此类框架训练神经网络大多遵循如下四个阶段的标准程序。
在 PyTorch 中,常规神经网络训练代码的结构。
训练模型需要先定义网络结构,图 2 为一个简化的图像分类代码,取自官方的 PyTorch MNIST 分类示例:

在这里,上述代码首先定义一系列神经网络层,并使它们成为单一的神经网络模块。为了正确组装层,前一层的返回张量必须满足下一层的输入要求。网络使用超参数的初始化参数进行实例化,例如隐藏层的数量。接下来,对输入数据集进行预处理并根据网络的要求进行调整。从该阶段开始,每个数据集都被切成较小的相同大小的块(minibatch)。最后,主循环开始,minibatch 按顺序输入网络。一个 epoch 是指将整个数据集传递到网络的单个循环,并且 epoch 的数量通常取决于神经网络的目的和结构。除了取决于数据集大小的主训练循环之外,包括 epoch 数在内,训练代码中的迭代次数在大多数情况下被确定为常数。
在构建模型时,网络层之间输入、输出张量形状的不对应就是张量形状错误。通常形状错误很难手动查找,只能通过使用实际输入运行程序来检测。下图就是典型的张量形状错误(对图 2 的简单修改),如果不仔细查看,你根本发现不了错误:

对于张量形状错误(如上图的错误类型),PyTea 将原始 Python 代码翻译成 PyTea IR 进行查找,如下图是 PyTea IR 示例:

上面提到,PyTea 会跟踪转换后的 IR 的每个可能执行路径,并收集有关张量形状约束。其实约束是 PyTorch 应用程序所需要的条件,以便在没有任何张量形状误差的情况下执行它。例如,一个矩阵乘法运算的两个操作数必须共享相同的维数。下图显示了约束的抽象语法:

约束的抽象语法部分截图
如何使用 PyTea
首先,安装环境要求:node.js >= 12.x,python >= 3.8,z3-solver >= 4.8。
安装和使用可参考以下代码:
# install node.js
sudo apt-get install nodejs
# install python z3-solver
pip install z3-solver
# download pytea
wget https://github.com/ropas/pytea/releases/download/v0.1.0/pytea.zip
unzip pytea.zip
# run pytea
python bin/pytea.py path/to/source.py
# run example file
python bin/pytea.py packages/pytea/pytest/basics/scratch.py

编译代码:
# install dependencies
npm run install:all
pip install z3-solver
# build
npm run build

相关文章阅读:
资源分享 | SAHI:超大图片中对小目标检测的切片辅助超推理库
欢迎关注公众号 CV技术指南 ,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读。
在公众号中回复关键字 “入门指南“可获取计算机视觉入门所有必备资料。

其它文章
ICCV2021 | Tokens-to-Token ViT:在ImageNet上从零训练Vision Transformer
CVPR2021 | TrivialAugment:不用调优的SOTA数据增强策略
PyTorch和TensorFlow在模型可用性、部署便捷度和生态系统方面对比
Panoptic SegFormer:端到端的 Transformer 全景分割通用框
ICCV2021 | 简单有效的长尾视觉识别新方案:蒸馏自监督(SSD)
AAAI2021 | 任意方向目标检测中的动态Anchor学习
ICCV2021 | 用于视觉跟踪的学习时空型transformer
Batch Size对神经网络训练的影响|计算机视觉入门路线
全面理解目标检测中的anchor| 实例分割综述总结综合整理版
HOG和SIFT图像特征提取简述| OpenCV高性能计算基础介绍
目标检测中回归损失函数总结| Anchor-free目标检测论文汇总
视频理解综述:动作识别、时序动作定位、视频Embedding
资源分享 | PyTea:不用运行代码,静态分析pytorch模型的错误的更多相关文章
- Understand:高效代码静态分析神器详解(转)
之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面,虽说很多东西都方便了,但是却没有了静态代码分析工具,很幸运,前段时间找到一款比source ins ...
- 国外一些好用的UX/UI设计工具和资源分享
国外一些好用的UX/UI设计工具和资源分享 你今天使用的设计工具也许不再适合以后的网页和APP设计项目了.新的工具不断的推出市场,目标只有一个,让你的工作更快.更容易而且工作成效更好.今天分享的这些U ...
- (转) 深度强化学习综述:从AlphaGo背后的力量到学习资源分享(附论文)
本文转自:http://mp.weixin.qq.com/s/aAHbybdbs_GtY8OyU6h5WA 专题 | 深度强化学习综述:从AlphaGo背后的力量到学习资源分享(附论文) 原创 201 ...
- Understand:高效代码静态分析神器详解(一)
Understand:高效代码静态分析神器详解(一) Understand 之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面,虽说很多东西都方便 ...
- Understand:高效代码静态分析神器详解(一) | 墨香博客 http://www.codemx.cn/2016/04/30/Understand01/
Understand:高效代码静态分析神器详解(一) | 墨香博客 http://www.codemx.cn/2016/04/30/Understand01/ ===== 之前用Windows系统,一 ...
- Understand:高效代码静态分析神器详解(一)【转】
转自:http://www.codemx.cn/2016/04/30/Understand01/ 之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面, ...
- 代码静态分析工具-splint的学习与使用[转]
代码静态分析工具--splint的学习与使用[转] 引言 最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便.PC-Lint是一款针对C/C++语言.window ...
- C/C++代码静态分析工具调研
C/C++代码静态分析工具调研 摘自:https://www.jianshu.com/p/92886d979401 简述 静态分析(static analysis)是指在不执行代码的情况下对其进行分析 ...
- Understand:高效代码静态分析神器详解(一) 转
之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面,虽说很多东西都方便了,但是却没有了静态代码分析工具,很幸运,前段时间找到一款比source ins ...
随机推荐
- .NET E F(Entity Framework)框架 DataBase First 和 Code First 简单用法。
EF是微软.NET平台官方的ORM(objet-relation mapping),就是一种对象-关系 映射,是将关系数据库种的业务数据用对象的形式表现出来,并通过面向对象的方式讲这些对象组织起来,实 ...
- CF1610F F. Mashtali: a Space Oddysey
我们首先发现有如下性质: 我们不妨先随机定向边,那么我们发现无论我们如何翻转边. 都会对其两端的点,造成 \(2 / 4\) 的影响,所以我们发现如果一个点其和他相连的所有边权和为偶数,则我们不能调整 ...
- [NOIP2017 提高组] 宝藏
考虑到这种对于某种操作顺序有一个权值. 且这个权值有一个\(O(n)\)或者更好的复杂度求出. 求最值. 那可以用模拟退火. #include<iostream> #include< ...
- Golang: map类型切片内存分配
切片ik通过索引访问,然后为每个map分配内存: 切片jk通过获得切片内每个元素的拷贝来分配内存,并未成功为切片内每个map分配内存,使用时赋值也就失败了 1 package main 2 3 imp ...
- 金蝶EAS——客户端打开时,提示正在更新的文件d:\eas\client\bin\lib\proxy.jar被其他应用程序占用.请关闭
解决办法: 一.通过调用任务管理器来退出,启用任务管理器需同时按下键Ctrl+Alt+Del,在应用程序中找到金蝶EAS,单击,选择结束任务即可:或者在任务管理器中选择"进程",点 ...
- typedef 的用法
[2]typedef (1)在C语言中,允许使用关键字typedef定义新的数据类型 其语法如下: typedef <已有数据类型> <新数据类型>; 如: typedef i ...
- Git五个常见问题及解决方法
一.删除远程仓库上被忽略的文件 由于种种原因,一些本应该被忽略的文件被我们误操作提交到了远程仓库了.那么我们该怎么删除这些文件呢? 以误提交了.idea目录为例,我们可以通过下面的步骤处理: 1)我们 ...
- Yarn 生产环境核心配置参数
目录 Yarn 生产环境核心配置参数 ResourceManager NodeManager Container Yarn 生产环境核心配置参数 ResourceManager 配置调度器 yarn. ...
- day8 基本数据类型之字典
day8 基本数据类型之字典 一.字典(dict) 1.用途: 2.定义方式:在{}内用逗号分隔开多个元素,每个元素都是key:value的形式,其中value可以使任意类型,而key必须是不可变类型 ...
- 前端必须知道的 Nginx 知识
Nginx一直跟我们息息相关,它既可以作为Web 服务器,也可以作为负载均衡服务器,具备高性能.高并发连接等. 1.负载均衡 当一个应用单位时间内访问量激增,服务器的带宽及性能受到影响, 影响大到自身 ...