The small absolute error is most likely created by the limited numerical precision using flaot32 and you should get a smaller error using float64.
Also note, that using torch.log(torch.softmax(...)) is numerically less stable than F.log_softmax, as the latter applies the log-sum-exp trick to increase the stability.