Tsanley:理解张量程序
tsanle的Python项目详细描述
赞利
Tsanley是张量程序的形状分析器,使用流行的张量库:tensorflow
,pytorch
,numpy
。无缝地插入到现有代码中,更改最少。在
构建在库tsalib上,用于使用命名维度来指定、注释和转换张量形状。在
快速启动
tsanley
通过对照用户指定的形状批注检查运行时张量形状,在运行时发现形状错误。张量形状注释在tsalib
形状速记符号中指定,例如x: 'btd'
。在
有关速记格式here的更多详细信息。在
示例
假设我们在现有代码中有以下函数foo
和test_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
中张量变量(x
,y
,z
)的形状,并报告以下形状检查结果。在
输出
^{pr2}$设置名为_dims做什么?
- 声明命名的维度变量(使用
dim_vars
)——使用它们我们可以指定代码中张量变量的预期形状。例如,这里我们声明了3个维度变量,Batch
,Length
和{},并通过速记名 b
,t
,d
来引用它们。在 - 我们使用简写名称来标记张量变量,并在一个或多个函数中检查它们的形状,例如,
foo
。在 - 通过调用
init_analyzer
来初始化tsanley
分析器:参数trace_func_names
将函数名列表作为unixshell样式的通配符(使用fnmatch
库)。我们可以用通配符指定名称,例如,Resnet.*
来跟踪Resnet
类中的所有函数。在
请参阅models目录中的示例。在
安装
pip install tsanley
注释
tsanley
还可以用形状标签注释现有的executable代码中的张量变量。这在试图理解外部开放源代码或标记自己的代码时非常有用。在
假设有一些未注释的代码驻留在文件model.py
中。在
- 首先,通过将
setup_named_dims
添加到model.py
来生成shape logs。在 - 执行
model.py
。日志存储在/tmp/shape_log.json
中。在 - 使用日志来注释
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
示例进行测试。tensorflow
和numpy
程序也可以工作(tsalib
支持的后端),但仍有待测试。在
- 项目
标签: