Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compiled functions can't take variable number of arguments or use keyword-only arguments with defaults #9638

Open
KevinHooah opened this issue Sep 4, 2024 · 5 comments
Labels

Comments

@KevinHooah
Copy link

KevinHooah commented Sep 4, 2024

🐛 Describe the bug

Bug Description

The latest release mentions fixing the issue of converting the model to TorchScript when it contains message_passing. However, we tested it and found that this bug remains.

Bug's Detail:

The error message:

Compiled functions can't take variable number of arguments or use keyword-only arguments with defaults:
File "some_path/pytorch_geometric-master/torch_geometric/nn/conv/message_passing.py", line 425
edge_index: Adj,
size: Size = None,
**kwargs: Any,
~~~~~~~ <--- HERE
) -> Tensor:
r"""The initial call to start propagating messages.

The toy model taken from official tutorial:

import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.nn import MessagePassing
from torch.nn import Linear, Parameter
from torch_geometric.utils import add_self_loops, degree

class GCNConv(MessagePassing):
    def __init__(self, in_channels, out_channels):
        super().__init__(aggr='add') 
        self.lin = Linear(in_channels, out_channels, bias=False)
        self.bias = Parameter(torch.empty(out_channels))
        self.reset_parameters()
    def reset_parameters(self):
        self.lin.reset_parameters()
        self.bias.data.zero_()
    def forward(self, x, edge_index):
        edge_index, _ = add_self_loops(edge_index, num_nodes=x.size(0))
        x = self.lin(x)
        row, col = torch.split(edge_index, 1, dim=0) #<-- We modified this line
        deg = degree(col, x.size(0), dtype=x.dtype)
        deg_inv_sqrt = deg.pow(-0.5)
        deg_inv_sqrt[deg_inv_sqrt == float('inf')] = 0
        norm = deg_inv_sqrt[row] * deg_inv_sqrt[col]
        out = self.propagate(edge_index, x=x, norm=norm)
        out = out + self.bias
        return out
    def message(self, x_j, norm):
        return norm.view(-1, 1) * x_j

test_model = GCNConv(10, 10)

The line of code triggered the issue:

script_test_model = torch.jit.script(test_model)

A side bug we found during this process:

If we completely follow the official tutorial's code without modifying that line with a comment, i.e.,

# the original code in the tutorial
row, col = edge_index

The error message will be:

Tensor cannot be used as a tuple:
File "/var/folders/3f/5776h3152rs7rlmtldx8gyxh0000gn/T/ipykernel_15097/3913400558.py", line 14
x = self.lin(x)
# row, col = torch.split(edge_index, 1, dim=0)
row, col = edge_index
~~~~~~~~~~ <--- HERE
deg = degree(col, x.size(0), dtype=x.dtype)
deg_inv_sqrt = deg.pow(-0.5)

Versions (Corrected)

I am testing it with my Mac in an environment where torch_geometric is not installed. I downloaded the latest code base and directly imported it from this local source. This issue persists when we test our model on the GPU machine with 2.5.3. version is installed.

Versions of relevant libraries:
[pip3] flake8==3.8.4
[pip3] mypy-extensions==0.4.3
[pip3] numpy==1.24.4
[pip3] numpydoc==1.1.0
[pip3] torch==2.2.1
[pip3] torchaudio==2.2.1
[pip3] torchvision==0.17.1
[conda] blas 1.0 mkl
[conda] mkl 2021.4.0 hecd8cb5_637
[conda] mkl-service 2.4.0 py38h9ed2024_0
[conda] mkl_fft 1.3.1 py38h4ab4a9b_0
[conda] mkl_random 1.2.2 py38hb2f4e1b_0
[conda] numpy 1.24.4 pypi_0 pypi
[conda] numpydoc 1.1.0 pyhd3eb1b0_1
[conda] torch 2.2.1 pypi_0 pypi
[conda] torchaudio 2.2.1 pypi_0 pypi
[conda] torchvision 0.17.1 pypi_0 pypi

@KevinHooah KevinHooah added the bug label Sep 4, 2024
@rachitk
Copy link
Contributor

rachitk commented Sep 4, 2024

The version of torch_geometric implied by your environment is 2.2.0, rather than the most recent release of 2.5.3. Does the issue persist in the most recent version of torch_geometric?

@KevinHooah
Copy link
Author

The version of torch_geometric implied by your environment is 2.2.0, rather than the most recent release of 2.5.3. Does the issue persist in the most recent version of torch_geometric?

Hello, thank you for the reply. I found I copied the environment information from the wrong one.

We tried two approaches:

  • Installing 2.5.3 from Pip
  • Directly download the latest code base, and directly import all necessary codes from this local source code (in an environment where torch_geometric was not installed)

Both methods don't work, all tell me this error.

@rusty1s
Copy link
Member

rusty1s commented Sep 13, 2024

It works for me. Can you do me a favor and modify this line to

except Exception as e:
    print(e)

and see what comes back?

@KevinHooah
Copy link
Author

It works for me. Can you do me a favor and modify this line to

except Exception as e:
    print(e)

and see what comes back?

Hi, following the step, the exception I got when I initiated the GCNConv(MessagePassing) is:
<class '__main__.GCNConv'> is a built-in class

@KevinHooah
Copy link
Author

Hello, a little more info: even though I changed the model's name to GCNConv_test(MessagePassing), the exception remains the same.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants