It is possible to set val_data to None in SupervisedTrainer.train, and it is handled (for example in CallbackContainer._evaluate_model_on_validation). But, if I set val_data to None, the total_loss in Callback.get_losses is never calculated, so checkpoints are never saved in CallbackContainer.on_batch_end.
So, you should (1) log a warning saying that dev_data should not be None, or (2) handle checkpoint saving in another way when there is no dev_data (such as saving last checkpoints instead of the ones with best loss values.