Well, the training time per epoch depends on your dataset size. If you have a large dataset, 15min might the expected time. Or do you that each batch is slow?
You can certainly increase the batch size to 32 or 64. This will certainly give you an performance boost. In this case, you might also want to increase the learning rate a bit as well.
You also use a lot of unnecessary to() calls. Once a tensor is on the device, it stays there. for example, you can do
x = x.long().to(device)
y = y.long().to(device)

And remove all other to() calls, particular in the forward() method. Admittedly, I have no idea if this affects the performance at all. Probably not.
Otherwise, I can’t see anything wrong with your code, and it seems to train. Other things to consider might be the data, e.g., in case you have very long sequences.