Because you need a lot more information to perform back-propagation.
For backpropagation you take the diff between actual and expected output and you go backwards to calculate derivate and apply it with optimiser - that's 8 extra bytes for single precision floats per trainable parameter.
Why do you need 80?
Even for fp64 it adds only 16 bytes.
RMSPRop, Adagrad have half of this overhead.
SGD has no optimizer overhead of course.
But all of that (trainable parameters, activations, optimizer state) is like 12 bytes per trainable parameter, not 80.
For LLMs you need to load single row of context size, that's vector of ie. 8k numbers, which is 32kB for single precision floats.