使用Huggingface SFTTrainer微调Llama 2时如何按步保存检查点?
Llama 2 QLoRA微调:检查点保存问题修复与每N步保存配置
问题根源
你当前的代码里,TrainingArguments仅设置了save_strategy="steps",但缺少save_steps参数——这是控制每多少步保存一次检查点的核心配置。另外自定义的PeftSavingCallback逻辑需要和Trainer默认保存流程配合,否则可能导致检查点路径混乱或保存失效。
解决方案:配置每5/10步保存检查点
按以下步骤修改代码,确保检查点正常生成且位置可查:
1. 修正TrainingArguments参数
在TrainingArguments中添加save_steps,同时统一评估与保存的步长逻辑:
output_dir = "./Llama-2-7b-hf-qlora" training_args = TrainingArguments( output_dir=output_dir, per_device_train_batch_size=4, gradient_accumulation_steps=4, learning_rate=2e-4, logging_steps=5, max_steps=400, evaluation_strategy="steps", logging_dir="./logs", save_strategy="steps", save_steps=5, # 每5步保存一次检查点,改成10即为每10步保存 eval_steps=5, # 评估步长与保存步长保持一致 do_eval=True, save_total_limit=3, # 可选:限制最多保存3个检查点,避免磁盘占满 )
2. 优化PeftSavingCallback逻辑
你的回调目的是仅保存PEFT适配器(而非完整模型),修改逻辑避免和Trainer默认保存冲突:
class PeftSavingCallback(TrainerCallback): def on_save(self, args, state, control, **kwargs): # 生成对应步长的检查点路径 checkpoint_path = os.path.join(args.output_dir, f"checkpoint-{state.global_step}") # 仅保存PEFT模型的适配器权重 kwargs["model"].save_pretrained( checkpoint_path, save_config=True, save_peft_format=True ) # 删除Trainer默认保存的完整模型文件(如果存在) full_model_path = os.path.join(checkpoint_path, "pytorch_model.bin") if os.path.exists(full_model_path): os.remove(full_model_path)
3. 验证检查点位置
训练启动后,检查点会自动生成在./Llama-2-7b-hf-qlora目录下,每个检查点对应一个形如checkpoint-5、checkpoint-10的子文件夹,里面仅包含LoRA适配器的权重文件(如adapter_model.bin),不会占用过多磁盘空间。
额外说明
- 若要改为每10步保存,只需将
save_steps和eval_steps同时修改为10即可。 save_total_limit参数会自动清理旧检查点,防止磁盘被大量文件占满,建议开启。
内容的提问来源于stack exchange,提问作者johnny
相关产品推荐
相关产品推荐

