Problem solved. I migrated from 0.3.0 to 0.4.0, so I add  with torch.no_grad(): myself (in a wrong place). That is like:
def validate(val_loader, model, criterion):
    batch_time = AverageMeter()
    losses = AverageMeter()
    top1 = AverageMeter()
    top5 = AverageMeter()

    # switch to evaluate mode
    model.eval()

    end = time.time()
    for i, (inputs, target) in enumerate(val_loader):

        with torch.no_grad():
            input_var = torch.autograd.Variable(inputs.cuda())
            target_var = torch.autograd.Variable(target.cuda())

        # compute output
        output = model(input_var)
        loss = criterion[0](output, target_var)
        ...

Recently, I read the example imagenet classification code of pytorch0.4.0, and find that it puts torch.no_grad() in a different place. That is like:
def validate(val_loader, model, criterion):
    batch_time = AverageMeter()
    losses = AverageMeter()
    top1 = AverageMeter()
    top5 = AverageMeter()

    # switch to evaluate mode
    model.eval()
    
    with torch.no_grad():
        end = time.time()
        for i, (inputs, target) in enumerate(val_loader):
    
            input_var = torch.autograd.Variable(inputs.cuda())
            target_var = torch.autograd.Variable(target.cuda())
    
            # compute output
            output = model(input_var)
            loss = criterion[0](output, target_var)

IT WORKS ! Although I don’t know why.
I think this problem might easily come to PyTorch old-users, especially those migrate from 0.3.0 to the above.@ptrblck @ 54c41629a13193bc3c1f @lxtGH @solsol