012、实战:在单卡多卡上完成大模型全参数微调
012、实战:在单卡/多卡上完成大模型全参数微调一、从OOM报错说起昨天深夜,实验室的师弟跑来找我,屏幕上一行刺眼的CUDA out of memory。他试图在24G显存的3090上微调一个7B模型,加载完模型显存就爆了。“师兄,我不是只做微调吗,为什么比推理还吃显存?” 这个问题问得好,也是很多初学者第一次尝试全参数微调时会踩的坑。全参数微调(Full Parameter Fine-tuning)和推理最大的区别在于梯度计算和优化器状态。每个可训练参数都需要存储梯度,优化器(比如Adam)还要维护动量和方差两个状态。简单算笔账:7B模型用FP16加载,基础显存14GB,加上梯度14GB,Adam优化器状态28GB(每个参数需要2个FP32状态),还没算激活值就已经56GB了。这就是为什么单卡微调大模型需要技巧。二、单卡微调的生存法则先看一个能实际跑起来的单卡微调框架。我们以Hugging Face Transformers为例,但会加入一些工程上的调整:importtorchfromtransformersimportAutoModelForCausalLM,AutoTokenizer,TrainingArguments,Trainer# 关键技巧1:梯度累积# 单卡显存不够时,用时间换空间training_args=TrainingArguments(output_dir="./results",per_device_train_batch_size=2,# 调小batch sizegradient_accumulation_steps=8,# 累积8步相当于batch_size=16num_train_epochs=3,logging_dir="./logs",save_steps=500,fp16=True,# 混合精度训练,省显存还能加速gradient_checkpointing=True,# 用计算换显存,重要!)# 关键技巧2:梯度检查点# 这个功能会让前向传播中间结果不保存,反向时重新计算model=AutoModelForCausalLM.from_pretrained("model_name",use_cache=False,# 训练时必须关掉cach