One adapter at rank 16 on a 4,096-wide matrix: A is 16 x 4,096 = 65,536 numbers and B is 4,096 x 16 = 65,536 numbers, so 131,072 in total. The frozen matrix beside it has 16,777,216 numbers, 128 times more. Put adapters on two matrices per layer, the query and value projections called q_proj and v_proj, across 32 layers, and you get 131,072 x 2 x 32 = 8,388,608 trainable numbers.
That is exactly what the Hugging Face PEFT library prints for Llama-2-7B with r=16, lora_alpha=32 and those two targets: 8,388,608 trainable parameters out of 6,746,804,224 in total, or 0.124 percent. The other 99.88 percent of the model stays frozen.
Freezing is where the memory saving comes from. Full fine-tuning needs about 16 bytes per weight: 2 for fp16 weights, 2 for fp16 gradients and 12 for three fp32 copies kept by the Adam optimizer. For 6.74 billion weights that is about 108 GB before activations. With LoRA the frozen base needs no gradients and no optimizer state, so you hold the roughly 14 GB fp16 base plus an adapter that, even at 16 bytes per trainable weight, is about 0.13 GB.