def METHOD_NAME(self):
    with gpytorch.settings.fast_pred_var(), gpytorch.settings.debug(False):
        train_x, train_y, test_x, test_y = make_data()
        likelihood = GaussianLikelihood()
        gp_model = GPRegressionModel(train_x, train_y, likelihood)
        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
        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()
        # Set the cache
        test_function_predictions = likelihood(gp_model(train_x))
        # Now bump up the likelihood to something huge
        # This will make it easy to calculate the variance
        likelihood.raw_noise.data.fill_(3)
        test_function_predictions = likelihood(gp_model(train_x))
        noise = likelihood.noise
        var_diff = (test_function_predictions.variance - noise).abs()
        self.assertLess(torch.max(var_diff / noise), 0.05)