You need to make sure that validation is run before saving the model.
Here is a synthetic example you can play with to understand how it works and fix your problem
!rm -rf /tmp/ignite-mse-example/

import torch


from ignite.engine import Engine, Events
from ignite.handlers import Checkpoint, DiskSaver
from ignite.metrics import MeanSquaredError


num_epochs = 50
num_train_samples_per_epoch = 25
num_val_samples_per_epoch = 10

batch_size = 4
num_features = 5
val_targets = torch.rand(num_val_samples_per_epoch, batch_size, num_features)
val_preds = val_targets + torch.rand(num_val_samples_per_epoch, batch_size, num_features) * 0.01


trainer = Engine(lambda e, b: None)


def validation_step(e, b):
    i = e.state.iteration - 1    
    err = (num_epochs - trainer.state.epoch - 1) * torch.rand(batch_size, num_features)    
    y_preds = val_preds[i, ...] + err
    y = val_targets[i, ...]
    return y_preds, y
    

evaluator = Engine(validation_step)

mse_metric = MeanSquaredError()
mse_metric.attach(evaluator, "mse")


val_every = 5

@trainer.on(Events.EPOCH_COMPLETED(every=val_every))
def run_validation():
    print("{} : Run validation ...".format(trainer.state.epoch))
    val_data = range(num_val_samples_per_epoch)
    evaluator.run(val_data)
    print("Val MSE:", evaluator.state.metrics["mse"])


def score_function(_):
    # !!! MAKE SURE THAT MSE SCORE IS ALREADY COMPUTED !!!
    mse = evaluator.state.metrics["mse"]
    return -mse

to_save = {'model': torch.nn.Linear(10, 10)}
handler = Checkpoint(
    to_save, 
    DiskSaver("/tmp/ignite-mse-example"), 
    n_saved=3, 
    score_function=score_function, 
    score_name="val_mse",
    global_step_transform=lambda _1, _2: trainer.state.epoch
)

trainer.add_event_handler(Events.EPOCH_COMPLETED(every=val_every), handler)


train_data = range(num_train_samples_per_epoch)
trainer.run(train_data, max_epochs=num_epochs)

!ls /tmp/ignite-mse-example/