LLaMA-Factory SFT训练中断排查与恢复:从‘僵尸进程’到成功续训的全记录
LLaMA-Factory SFT训练中断排查与恢复实战指南当你正在全神贯注地进行LLaMA模型的SFT微调时突然发现训练进程停滞不前GPU显存依然占用但数据不再流动——这种僵尸状态令人抓狂。本文将带你深入排查这类问题并提供一套完整的恢复训练方案。1. 训练中断的典型症状与初步诊断训练中断往往不会直接报错退出而是进入一种假死状态。以下是几种常见表现日志停滞日志文件最后几行显示正常没有error或warning信息资源占用GPU显存保持占用状态但利用率降至0%进程存活llamafactory-cli进程仍在运行但CPU使用率极低遇到这种情况首先检查两个关键文件ls -l trainer_log.jsonl all_results.json这两个文件的状态组合能告诉我们训练的真实情况文件状态组合含义trainer_log.jsonl存在all_results.json不存在训练未完成可以恢复两者都存在训练已完成无需恢复两者都不存在训练未开始或严重错误2. 深入分析检查点文件LLaMA-Factory在训练过程中会定期保存检查点通常存储在checkpoint-数字格式的文件夹中。一个完整的检查点应包含pytorch_model.bin模型权重optimizer.pt优化器状态scheduler.pt学习率调度器状态trainer_state.json训练状态元数据验证检查点完整性的快速方法checkpoint_dircheckpoint-300 # 示例检查点 required_files(pytorch_model.bin optimizer.pt scheduler.pt trainer_state.json) for file in ${required_files[]}; do if [ ! -f ${checkpoint_dir}/${file} ]; then echo 检查点不完整缺少 ${file} exit 1 fi done echo 检查点完整可以恢复训练3. 自动化恢复训练方案手动恢复训练容易出错下面提供一个健壮的自动化脚本#!/bin/bash # 配置参数 save_path./output model_name_or_pathmeta-llama/Llama-2-7b-hf dataset_dir./data alpaca_dataset_namealpaca_data templatellama2 log_dir./logs # 自动检测最新检查点 resume_from_checkpointNone if [ ! -f ${save_path}/all_results.json ] [ -f ${save_path}/trainer_log.jsonl ]; then # 获取数字最大的检查点文件夹 max_checkpoint$(find ${save_path} -maxdepth 1 -type d -name checkpoint-* | awk -F checkpoint- {print $2} | sort -n | tail -1) if [ -n ${max_checkpoint} ]; then resume_from_checkpoint${save_path}/checkpoint-${max_checkpoint} echo 检测到可恢复的检查点: ${resume_from_checkpoint} else echo 未找到有效检查点将从头开始训练 fi fi # 训练命令 train_cmdllamafactory-cli train \ --stage sft \ --do_train True \ --model_name_or_path ${model_name_or_path} \ --preprocessing_num_workers 16 \ --finetuning_type lora \ --template ${template} \ --flash_attn auto \ --dataset_dir ${dataset_dir} \ --dataset ${alpaca_dataset_name} \ --cutoff_len 2048 \ --learning_rate 2e-05 \ --num_train_epochs 2.0 \ --per_device_train_batch_size 2 \ --gradient_accumulation_steps 4 \ --lr_scheduler_type cosine \ --max_grad_norm 1.0 \ --logging_steps 5 \ --save_steps 100 \ --warmup_steps 100 \ --packing False \ --report_to none \ --output_dir ${save_path} \ --fp16 True \ --plot_loss True \ --trust_remote_code True \ --ddp_timeout 180000000 \ --include_num_input_tokens_seen True \ --optim adamw_torch \ --lora_rank 16 \ --lora_alpha 32 \ --lora_dropout 0 \ --lora_target all \ --val_size 0.1 \ --eval_strategy steps \ --eval_steps 100 \ --per_device_eval_batch_size 1 # 如果找到检查点添加恢复参数 if [ ${resume_from_checkpoint} ! None ]; then train_cmd${train_cmd} --resume_from_checkpoint ${resume_from_checkpoint} fi # 执行训练 eval ${train_cmd} ${log_dir}/sft.log 21这个脚本实现了以下智能检测通过检查all_results.json和trainer_log.jsonl判断训练是否完成自动查找最新的有效检查点根据检测结果决定是恢复训练还是从头开始4. 预防训练中断的最佳实践与其在中断后恢复不如从一开始就做好预防措施硬件配置建议使用ECC内存的服务器级GPU确保电源稳定最好配备UPS监控GPU温度避免过热降频软件配置优化# 在训练配置中添加这些参数可提高稳定性 training_args { ddp_timeout: 3600, # 增加分布式训练超时 gradient_checkpointing: True, # 减少显存使用 fp16: True, # 混合精度训练 save_strategy: steps, save_steps: 500, # 更频繁的保存检查点 logging_steps: 50, resume_from_checkpoint: True # 默认尝试恢复 }监控方案使用nvidia-smi -l 1实时监控GPU状态设置日志轮转避免单个日志文件过大配置训练状态心跳检测如# 简易心跳检测脚本 while true; do last_log$(tail -n 1 trainer_log.jsonl) if [ $(date -d $(echo $last_log | jq -r .time) %s) -lt $(date -d 5 minutes ago %s) ]; then echo 训练可能已停滞最后日志时间: $(echo $last_log | jq -r .time) # 自动恢复逻辑... fi sleep 300 done5. 高级调试技巧当标准恢复方法无效时可以尝试这些高级手段检查点完整性验证import torch from transformers import LlamaForCausalLM def validate_checkpoint(checkpoint_path): try: model LlamaForCausalLM.from_pretrained(checkpoint_path) print(f检查点 {checkpoint_path} 加载成功) return True except Exception as e: print(f检查点 {checkpoint_path} 损坏: {str(e)}) return False手动修复训练状态 有时trainer_state.json可能损坏可以手动编辑{ epoch: 1.5, global_step: 1500, max_steps: 2000, log_history: [...], best_metric: null, best_model_checkpoint: null }关键字段说明global_step恢复后将从这个步骤继续epoch当前epoch的小数表示进度max_steps总训练步数分布式训练恢复特别注意事项 在多GPU环境中确保所有进程都能访问检查点路径并添加这些参数llamafactory-cli train \ --resume_from_checkpoint ${checkpoint_path} \ --ddp_find_unused_parameters False \ --local_rank ${LOCAL_RANK} \ ...在实际项目中我发现设置--save_steps为适当值如500能在恢复灵活性和存储开销间取得平衡。同时定期手动备份关键检查点也是个好习惯。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2489675.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!