Skimming through the code I cannot see anything obviously wrong.
Could you check some gradients after calling loss.backward()?
You could print them using:
print(model.outp.weight.grad)
print(model.embs[0].weight.grad)

If you see some None values, something is broken. Otherwise we would have to dig a bit deeper.
PS: You can add code snippets using three backticks ```
This makes it easier to copy your code and debug it.