TinyNeuralNetwork icon indicating copy to clipboard operation
TinyNeuralNetwork copied to clipboard

assert count_include_pad in (True,1)

Open quhaoooo opened this issue 3 years ago • 13 comments

请问这是什么原因呢? image

quhaoooo avatar May 09 '22 12:05 quhaoooo

因为目前不支持count_include_pad=False的avgpool2d,如果是same padding的情况下实现会比较简单,但是如果是其他情况下,需要额外添加一个mask乘的操作,会有点麻烦

peterjc123 avatar May 10 '22 01:05 peterjc123

已经添加了使用乘mask的等效实现的count_include_pad=False的avgpool2d,可以重新拉一下试试

peterjc123 avatar May 10 '22 03:05 peterjc123

ok 重新拉去后这个问题就消失了,作者太给力了然后我往下运行,出现了: image 基本上是光流和transformer相关的,这些算子作者有继续支持的计划吗?

除了error,logs中打印了许多的warning,如: imageimage 对于这些warning如果不修改的话会导致转换后的模型输出不正确是吗?

quhaoooo avatar May 10 '22 06:05 quhaoooo

对于这些warning如果不修改的话会导致转换后的模型输出不正确是吗?

不会,图1是pytorch使用floordiv的warning,图2只是int64自动下转成int32的例行打印。两者都跟精度没关系。

ok 重新拉去后这个问题就消失了,作者太给力了然后我往下运行,出现了: image 基本上是光流和transformer相关的,这些算子作者有继续支持的计划吗?

不知道哪些是常量操作,如果是常量操作可以直接跳过。方便提供下模型定义不?

peterjc123 avatar May 10 '22 07:05 peterjc123

您好,我列一下模型中调用算子的地方

  1. grid_sample
import torch.nn.functional as F
output = F.grid_sample(
        x,
        grid_flow,
        mode=interpolation,
        padding_mode=padding_mode,
        align_corners=align_corners)
  1. fill_
mask = x_window_pooled.new(T, nWh, nWw).fill_(1)
  1. img2col这个是nn.Unfold中调用了的
 return torch._C._nn.im2col(input, _pair(kernel_size), _pair(dilation), _pair(padding), _pair(stride))
相应的'nn.Fold'中调用了col2im
  1. new_zeros
 flow = ref[0].new_zeros(n, 2, h // 32, w // 32)
  1. new_ones
normalizer = x.new_ones(b, n, 49).view(-1, self.n_vecs, 49).permute(0, 2, 1)
  1. roll
 lambda t: torch.roll(t, shifts=(-self.expand_size[0], -self.expand_size[1]), dims=(2, 3)), (k, v)

这样应该会清楚很多哈

quhaoooo avatar May 10 '22 07:05 quhaoooo

按难度排个序吧

简单

new_zeros, new_ones 直接跳过,没啥可说的

fill_ 有直接对应

一般

roll 可以用strided_slice配合cat实现

img2col, col2im 可以用arange后的数据跑一遍,然后用gather_nd实现

困难

grid_sample 貌似没有直接对应

peterjc123 avatar May 10 '22 09:05 peterjc123

不好意思,第一次搞转化,直接跳过的 new_zeros, new_ones 还是麻烦您说一下。 fill_有直接对应的是啥意思呢?感谢

quhaoooo avatar May 10 '22 09:05 quhaoooo

@quhaoooo 参考这里 https://github.com/alibaba/TinyNeuralNetwork/blob/main/tinynn/converter/operators/torch/init.py#L189 ,就是不需要设置成不需要追踪的op就好了

peterjc123 avatar May 10 '22 09:05 peterjc123

@peterjc123 好的,请问一下这两个算子为什么是可以设置成不需要跟踪,另外至于fill_呢。 感谢

quhaoooo avatar May 10 '22 09:05 quhaoooo

好的,请问一下这两个算子为什么是可以设置成不需要跟踪,

因为他跟输入没关系啊,新生成了一个常量

另外至于fill_呢。 感谢

你是要实现吗?可以参考 https://github.com/alibaba/TinyNeuralNetwork/blob/main/docs/FAQ_zh-CN.md#%E7%AE%97%E5%AD%90%E4%B8%8D%E6%94%AF%E6%8C%81%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86 pytorch里的 fill 就是对应 tflite 的 fill

peterjc123 avatar May 10 '22 10:05 peterjc123

新生成的变量不需要跟踪,但是通过您的代码也会转成tfl是吧? 对于fill转换的实现,按照 https://github.com/alibaba/TinyNeuralNetwork/blob/main/docs/FAQ_zh-CN.md#%E7%AE%97%E5%AD%90%E4%B8%8D%E6%94%AF%E6%8C%81%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86

查阅TorchScript和TFLite的Schema,选取两边对应的OP

似乎在https://github.com/alibaba/TinyNeuralNetwork/blob/main/tinynn/converter/schemas/torch/aten_schema.py 没有找到fill_对应的OP

quhaoooo avatar May 10 '22 13:05 quhaoooo

@quhaoooo 话说其实fill产生的也是常量,schema里面没有是因为之前我们生成schema的时候过滤了大部分inplace的tensor操作。我们不完全支持inplace的操作,尤其是 对于某个tensor的一部分(使用slice或者select)做inplace操作的那就更不支持了。当然这都是对于变量来说了,常量不受任何影响。

新生成的变量不需要跟踪,但是通过您的代码也会转成tfl是吧?

会正常利用torchscript中的步骤计算其值,但是不会加入tflite计算图,直到遇到第一个包含变量输入且使用某常量值的op,在此时他会以常量加入计算图。(这个过程一般被称为常量折叠,constant folding,有兴趣的话可以自己了解下)

peterjc123 avatar May 11 '22 02:05 peterjc123

@peterjc123 好的,我去了解。谢谢大佬

quhaoooo avatar May 11 '22 04:05 quhaoooo

未添加的op已经记录在 https://github.com/alibaba/TinyNeuralNetwork/issues/123 中了

peterjc123 avatar Oct 09 '22 04:10 peterjc123