Your approach should work and self.bias is correctly defined as a parameter.
Here is a minimal code snippet, which shows that self.bias gets a valid gradient:
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # ReLU
        self.bias = nn.Parameter(torch.zeros(1), requires_grad=True)
        self.relu = nn.ReLU(inplace=True)
    
    def forward(self, x):
        x = x + self.bias
        x = self.relu(x)        
        return x

model = Net()
x = torch.randn(1, 1)
out = model(x)
out.mean().backward()
print(model.bias.grad)
> tensor([1.])

Depending on your use case and model, the gradient might be small and thus the bias wouldn’t be changed by a lot so you could check its .grad value.