Passing custom tensor using __torch_dispatch__ to nn.Parameter

Hi, I’m trying tensor subclassing examples in subclass_zoo/empty_tensor.py at main · albanD/subclass_zoo (github.com). The custom tensor class EmptyTensor does not have an actual tensor storage but returns dummy data on the fly. The behavior is implemented by __torch_dispatch__.

The custom tensor class behaves as expected. However, I am confused with a behavior when it is passed to torch.nn.Parameter.

rt = torch.randn(2, 2)
et = EmptyTensor(rt)
empty_weight = torch.nn.Parameter(et)
print(f"empty_weight={empty_weight.__class__} param?={isinstance(empty_weight, torch.nn.Parameter)}")

This displays:

empty_weight=<class 'empty_tensor.EmptyTensor'> param?=True

The expected class of empty_weight is torch.nn.Parameter. In addition, isinstance says it is an instance of torch.nn.Parameter though EmptyTensor is not a subclass of torch.nn.Parameter (it is a subclass of Tensor.

You can do the same with a normal tensor.

rt = torch.randn(2, 2)
real_weight = torch.nn.Parameter(rt)
print(f"real_weight={real_weight.__class__}")

As expected, the result is

real_weight=<class 'torch.nn.parameter.Parameter'>

Can anyone help me understand what is going here?