def METHOD_NAME(self):
    if not torch.cuda.is_available():
        return
    with least_used_cuda_device():
        train_x, train_y, test_x, test_y = make_data(cuda=True)
        likelihood = FixedNoiseGaussianLikelihood(torch.ones(100) * 0.001).cuda()
        gp_model = GPRegressionModel(train_x, train_y, likelihood).cuda()
        mll = gpytorch.mlls.ExactMarginalLogLikelihood(likelihood, gp_model)
        # Optimize the model
        gp_model.train()
        likelihood.train()
        optimizer = optim.Adam(gp_model.parameters(), lr=0.1)
        optimizer.n_iter = 0
        with gpytorch.settings.debug(False):
            for _ in range(25):
                optimizer.zero_grad()
                output = gp_model(train_x)
                loss = -mll(output, train_y)
                loss.backward()
                optimizer.n_iter += 1
                optimizer.step()
            for param in gp_model.parameters():
                self.assertTrue(param.grad is not None)
                self.assertGreater(param.grad.norm().item(), 0)
            # Test the model
            gp_model.eval()
            likelihood.eval()
            test_preds = likelihood(gp_model(test_x)).mean
            mean_abs_error = torch.mean(torch.abs(test_y - test_preds))
        self.assertLess(mean_abs_error.squeeze().item(), 0.02)