Traceback (most recent call last):
  File "/home/lowen/PycharmProjects/533_CTR/main.py", line 12, in <module>
    trainer.fire(train_data_path='./data/new_merge_onehot/uid_train_new_all_onehot.csv')
  File "/home/lowen/PycharmProjects/533_CTR/trainer/FFM_trainer.py", line 139, in fire
    self.train_eval(train_data_loader, epoch, index)
  File "/home/lowen/PycharmProjects/533_CTR/trainer/FFM_trainer.py", line 61, in train_eval
    self.optimizer.step()
  File "/home/lowen/anaconda3/envs/newEnv/lib/python3.6/site-packages/torch/optim/adagrad.py", line 92, in step
    state['sum'].addcmul_(1, grad, grad)
RuntimeError: Expected object of backend CPU but got backend CUDA for argument #4 'tensor1'

This Error is code optimizer.step(). I had put all data and model in cuda. I have no idea about this error . The forward() method was ok and no exception arrowd.  I got the logits and calulated the loss using BCEWithLogitsLoss, and then i loss.backward() and optimizer.step(), I got this error!
my model : Filed Factorization Machine
model,input data ,criterion all are in GPU
class FiledFactorizationMachine(nn.Module):
    def __init__(self, n, k, f):
        super(FiledFactorizationMachine, self).__init__()
        self.best_model_path = None
        
        self.n = n  # total onehot dim
        self.k = k  # K
        self.f = f  
        self.linear = nn.Linear(2, 1)
        
        self.linear_embedding = nn.ModuleList(
            [nn.Embedding(feature_size, 1) for feature_size in constants.new_columns_to_onehot_dim])
        
        self.cross_embedding_lists = nn.ModuleList(
            [nn.ModuleList(
                [nn.Embedding(filed_dim, opt.FFM_K) for _ in range(len(constants.new_columns_to_onehot_dim))])
                for i_filed, filed_dim in enumerate(constants.new_columns_to_onehot_dim)])
        self.bias = nn.Parameter(torch.randn(1))

        self.best_auc = 0  

    
    def forward(self, x_index, x_value):
        
        x_value = x_value.float()

        linear_part_temp = [emb(x_index[:, i]).squeeze() * x_value[:, i] for i, emb in enumerate(self.linear_embedding)]
        linear_part = sum(linear_part_temp)  
       
        cross_step_1 = [[torch.mul(embed(x_index[:, i]), x_value[:, i].unsqueeze(dim=1)) for embed in f_embeds] for
                        i, f_embeds in enumerate(self.cross_embedding_lists)]
        
        
        cross_step_2 = []
        for i in range(len(constants.new_columns_to_onehot_dim)):
            for j in range(i + 1,len(constants.new_columns_to_onehot_dim)):
                cross_step_2.append(torch.sum(torch.mul(cross_step_1[i][j], cross_step_1[j][i]), dim=-1))
        
        cross_part = sum(cross_step_2)
        logits = linear_part + cross_part + self.bias
        return logits