openfold icon indicating copy to clipboard operation
openfold copied to clipboard

Can't obtain grad in the openfold model

Open sgyersula opened this issue 2 years ago • 0 comments

Hi and thanks for your amazing model!

I would like to grab the gradient of the model before the optimizer.step. According to the definition, this can be fetched through the hook on_after_backward I add this in the OpenFoldWrapper:

def on_after_backward(self,):
    print('on after backward')
    for name,param in self.model.named_parameters():
        if param.grad is not None:
            print(name, 'exists')

None of the grad is available.

Another example of pytorch_lighting is:

import os
from torch import optim, nn, utils, Tensor
from torchvision.datasets import MNIST
from torchvision.transforms import ToTensor
import pytorch_lightning as pl

# define any number of nn.Modules (or use your current ones)
encoder = nn.Sequential(nn.Linear(28 * 28, 64), nn.ReLU(), nn.Linear(64, 3))
decoder = nn.Sequential(nn.Linear(3, 64), nn.ReLU(), nn.Linear(64, 28 * 28))

# define the LightningModule
class LitAutoEncoder(pl.LightningModule):
    def __init__(self, encoder, decoder):
        super().__init__()
        self.encoder = encoder
        self.decoder = decoder

    def training_step(self, batch, batch_idx):
        # training_step defines the train loop.
        # it is independent of forward
        x, y = batch
        x = x.view(x.size(0), -1)
        z = self.encoder(x)
        x_hat = self.decoder(z)
        loss = nn.functional.mse_loss(x_hat, x)
        # Logging to TensorBoard (if installed) by default
        self.log("train_loss", loss)
        return loss
    
    def on_after_backward(self,):
        for name,param in self.named_parameters():
            if param.grad is not None:
                print('exist')
        
    def configure_optimizers(self):
        optimizer = optim.Adam(self.parameters(), lr=1e-3)
        return optimizer


# init the autoencoder
autoencoder = LitAutoEncoder(encoder, decoder)

# setup data
dataset = MNIST(os.getcwd(), download=True, transform=ToTensor())
train_loader = utils.data.DataLoader(dataset)

# train the model (hint: here are some helpful Trainer arguments for rapid idea iteration)
trainer = pl.Trainer(limit_train_batches=100, max_epochs=1)
trainer.fit(model=autoencoder, train_dataloaders=train_loader)

However, in this case, the grad is available.

I wonder do I miss anything or does openfold have some optimization here?

Thanks!

sgyersula avatar Feb 11 '23 06:02 sgyersula