Files
openvino/tests/layer_tests/pytorch_tests/test_as_strided.py
Mateusz Mikolajczyk 891f79ac84 [PT FE] Add aten::as_strided (#19482)
* Add aten::as_strided

* rm commented code

* Update src/frontends/pytorch/src/op/as_strided.cpp

Co-authored-by: Maxim Vafin <maxim.vafin@intel.com>

* Update src/frontends/pytorch/src/op/as_strided.cpp

Co-authored-by: Maxim Vafin <maxim.vafin@intel.com>

* Fix CI error

* Fix CI issues

* mark_node for remaining constants

* Add test reproducing issue

* Use strides from torchscript

* Add led model to test suite

* Add sugested changes

---------

Co-authored-by: Maxim Vafin <maxim.vafin@intel.com>
2023-10-20 14:24:10 +04:00

126 lines
4.7 KiB
Python

# Copyright (C) 2018-2023 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
import numpy as np
import pytest
import torch
from pytorch_layer_test_class import PytorchLayerTest
class TestAsStrided(PytorchLayerTest):
def _prepare_input(self):
return (np.random.randn(8, 8).astype(np.float32),)
def create_model(self, size, stride, offset):
class aten_as_strided(torch.nn.Module):
def __init__(self, size, stride, offset):
super().__init__()
self.size = size
self.stride = stride
self.offset = offset
def forward(self, x):
return torch.as_strided(x, self.size, self.stride, self.offset)
ref_net = None
return aten_as_strided(size, stride, offset), ref_net, "aten::as_strided"
@pytest.mark.parametrize(
"size,stride",
[
([1], [1]),
([2, 2], [1, 1]),
([5, 4, 3], [1, 3, 7]),
([5, 5, 5], [5, 0, 5]),
([1, 2, 3, 4], [4, 3, 2, 1]),
],
)
@pytest.mark.parametrize("offset", [None, 1, 3, 7])
@pytest.mark.nightly
@pytest.mark.precommit
def test_as_strided(self, size, stride, offset, ie_device, precision, ir_version):
self._test(*self.create_model(size, stride, offset), ie_device, precision, ir_version, trace_model=True)
class TestAsStridedListConstruct(PytorchLayerTest):
def _prepare_input(self, size_shape_tensor=[1], stride_shape_tensor=[1]):
return (
np.random.randn(8, 8).astype(np.float32),
np.ones(size_shape_tensor),
np.ones(stride_shape_tensor),
)
def create_model(self, size, stride, offset, mode):
class aten_as_strided(torch.nn.Module):
def __init__(self, size, stride, offset, mode):
super().__init__()
self.size = size
self.stride = stride
self.size_shape_tensor = torch.empty(size)
self.stride_shape_tensor = torch.empty(stride)
self.offset = offset
modes = {
"no_const": self.forward_no_const,
"stride_const": self.forward_stride_const,
"size_const": self.forward_size_const,
}
self.forward = modes.get(mode)
def forward_no_const(self, x, size_shape_tensor, stride_shape_tensor):
sz1, sz2, sz3 = size_shape_tensor.shape
st1, st2, st3 = stride_shape_tensor.shape
return torch.as_strided(x, [sz1, sz2, sz3], [st1, st2, st3], self.offset)
def forward_stride_const(self, x, size_shape_tensor, stride_shape_tensor):
sz1, sz2, sz3 = size_shape_tensor.shape
return torch.as_strided(x, [sz1, sz2, sz3], self.stride, self.offset)
def forward_size_const(self, x, size_shape_tensor, stride_shape_tensor):
st1, st2, st3 = stride_shape_tensor.shape
return torch.as_strided(x, self.size, [st1, st2, st3], self.offset)
ref_net = None
return aten_as_strided(size, stride, offset, mode), ref_net, ["aten::as_strided", "prim::ListConstruct"]
@pytest.mark.parametrize("size,stride", [([5, 4, 3], [1, 3, 7]), ([5, 5, 5], [5, 0, 5])])
@pytest.mark.parametrize("offset", [None, 7])
@pytest.mark.parametrize("mode", ["no_const", "stride_const", "size_const"])
@pytest.mark.nightly
@pytest.mark.precommit
def test_as_strided_list_construct(self, size, stride, offset, mode, ie_device, precision, ir_version):
inp_kwargs = {"size_shape_tensor": size, "stride_shape_tensor": stride}
self._test(
*self.create_model(size, stride, offset, mode),
ie_device,
precision,
ir_version,
kwargs_to_prepare_input=inp_kwargs,
trace_model=True
)
class TestAsStridedLongformer(PytorchLayerTest):
def _prepare_input(self):
return (np.random.randn(1, 10, 20, 40).astype(np.float32).transpose([0, 2, 3, 1]),)
def create_model(self):
class aten_as_strided_lf(torch.nn.Module):
def forward(self, x):
chunk_size = list(x.size())
chunk_size[1] = chunk_size[1] * 2 - 1
chunk_stride = list(x.stride())
chunk_stride[1] = chunk_stride[1] // 2
return x.as_strided(size=chunk_size, stride=chunk_stride)
ref_net = None
return aten_as_strided_lf(), ref_net, "aten::as_strided"
@pytest.mark.nightly
@pytest.mark.precommit
def test_as_strided_lf(self, ie_device, precision, ir_version):
self._test(*self.create_model(), ie_device, precision, ir_version, trace_model=True, freeze_model=False)