Tsanley:理解张量程序

tsanle的Python项目详细描述


赞利

experimental

Tsanley是张量程序的形状分析器,使用流行的张量库:tensorflowpytorchnumpy。无缝地插入到现有代码中,更改最少。在

构建在库tsalib上,用于使用命名维度来指定、注释和转换张量形状。在

快速启动

tsanley通过对照用户指定的形状批注检查运行时张量形状,在运行时发现形状错误。张量形状注释在tsalib形状速记符号中指定,例如x: 'btd'。在

有关速记格式here的更多详细信息。在

示例

假设我们在现有代码中有以下函数footest_foo。为了在foo中设置tsanley分析器,我们在调用test_foo之前添加了一个函数setup_named_dims,根据张量变量预期的速记形状(例如,b,d)标记张量变量,然后正常执行代码。在

deffoo(x):x:'b,t,d'#shape check: ok!               [line 36]y:'b,d'=x.mean(dim=0)# error!         [line 37]z:'b,d'=x.mean(dim=1)#shape check: ok! [line 38]deftest_foo():importtorchx=torch.Tensor(10,100,1024)foo(x)defsetup_named_dims():fromtsalibimportdim_vars#declare the named dimension variables using the tsalib api#e.g., 'b' stands for 'Batch' dimension with size 10dim_vars('Batch(b):10 Length(t):100 Hidden(d):1024')# initialize tsanley's dynamic shape analyzerfromtsanley.dynamicimportinit_analyzerinit_analyzer(trace_func_names=['foo'],show_updates=True)#check_tsa=True, debug=Falseif__name__=='__main__':setup_named_dims()test_foo()

在执行上述程序时,tsanley跟踪函数foo中张量变量(xyz)的形状,并报告以下形状检查结果。在

输出

^{pr2}$

设置名为_dims做什么?

  • 声明命名的维度变量(使用dim_vars)——使用它们我们可以指定代码中张量变量的预期形状。例如,这里我们声明了3个维度变量,BatchLength和{},并通过速记名btd来引用它们。在
  • 我们使用简写名称来标记张量变量,并在一个或多个函数中检查它们的形状,例如,foo。在
  • 通过调用init_analyzer来初始化tsanley分析器:参数trace_func_names将函数名列表作为unixshell样式的通配符(使用fnmatch库)。我们可以用通配符指定名称,例如,Resnet.*来跟踪Resnet类中的所有函数。在

请参阅models目录中的示例。在

安装

pip install tsanley

注释

tsanley还可以用形状标签注释现有的executable代码中的张量变量。这在试图理解外部开放源代码或标记自己的代码时非常有用。在

假设有一些未注释的代码驻留在文件model.py中。在

  1. 首先,通过将setup_named_dims添加到model.py来生成shape logs。在
  2. 执行model.py。日志存储在/tmp/shape_log.json中。在
  3. 使用日志来注释test.py。在

示例

让我们重温前面的例子,不需要手动注释。假设它位于model.py。在

deffoo(x):y=x.mean(dim=0)z=x.mean(dim=1)deftest_foo():importtorchx=torch.Tensor(10,100,1024)foo(x)

我们在代码中添加setup_named_dims,并执行它。在

defsetup_named_dims():fromtsalibimportdim_vars#declare the named dimension variables using the tsalib api#e.g., 'b' stands for 'Batch' dimension with size 10dim_vars('Batch(b):10 Length(t):100 Hidden(d):1024')# initialize tsanley's dynamic shape analyzerfromtsanley.dynamicimportinit_analyzerinit_analyzer(trace_func_names=['foo'],show_updates=True,check_tsa=False)# debug=Falseif__name__=='__main__':setup_named_dims()test_foo()

这将在/tmp/shape_log.json中生成形状日志。标志check_tsa=False确保tsanley不执行任何形状检查。在

现在,使用以下命令注释foo

tsa annotate -f model.py

输出是一个文件tsa_model.py,其中foo更新如下:

deffoo(x):y:'t,d'=x.mean(dim=0)z:'b,d'=x.mean(dim=1)

tsanley进行智能猜测,将运行时形状值(100)映射到速记名称(t)。如果我们没有在setup_named_dims中使用dim_vars声明维度名称,我们将得到以下注释:

deffoo(x):y:'100,1024'=x.mean(dim=0)z:'10,1024'=x.mean(dim=1)

状态:实验性

tsanley在程序执行期间执行尽最大努力的形状跟踪。以下是一些棘手的情况:

  • 多次调用同一个函数——只缓存最后一次调用的形状值。在
  • 递归调用--未处理。在

pytorch示例进行测试。tensorflownumpy程序也可以工作(tsalib支持的后端),但仍有待测试。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JPA标准从数组中选择枚举   javajavafx:操作系统dockbar中程序的标题(例如ubuntu19.10)   java int数组和双数组差分   java如何用字母表填充字符数组?   java Lucene:如何考虑与原始术语的相似性?   eclipse如何获取java文件的路径,包括/src/   Java接口—通过多个层传递变量的替代方案   java动态字段和/或人工方法   带有表单登录的JavaSpringSecurityOAuth2   twitter4j使用Java从URL中提取tweet?   java JSP解析错误   java气泡排序交换每个数字,而不考虑值   java如何在变量中存储时间?   Java程序在Eclipse中运行良好,但不是作为一个整体。jar文件(配置路径是否错误??)   如何在LinuxShell中持续运行特定数量的java进程?   java c#始终允许向上转换   java正则表达式匹配阿拉伯日期或普通日期   类Java HashMap对象,整数