【个人开发】deepspeed+Llama-factory 本地数据多卡Lora微调【完整教程】_llamafactory deepspeed
文章目录
- 1.背景
- 2.微调方式
-
- 2.1 关键环境版本信息
- 2.2 步骤
- 2.2.1 下载llama-factory
- 2.2.2 准备数据集
- 2.2.3 微调模式
-
- 2.2.3.1 zero-1微调
- 2.2.3.2 zero-2微调
- 2.2.3.3 zero-3微调
- 2.2.3.4 单卡Lora微调
- 2.2.4 实验
-
- 2.2.4.1 实验1:多GPU微调-zero1
- 2.2.4.2 实验2:多GPU微调-zero2
- 2.2.4.3 实验3:多GPU微调-zero3
- 2.2.4.4 实验4:Lora单卡微调
- 2.2.5 合并大模型并启动
-
- 2.2.5.1 方法一:Llama-factory合并,并使用ollama调用大模型
- 2.2.5.2 方法二:Llama-factory合并,并使用vllm启动模型服务
- 3 踩坑经验
-
- 3.1 微调踩坑
-
- 3.1.1 问题一:ValueError: Undefined dataset xxxx in dataset_info.json.
- 3.1.2 问题二: ValueError: Target modules {\'c_attn\'} not found in the base model. Please check the target modules and try again.
- 3.1.3 问题三: RuntimeError: The size of tensor a (1060864) must match the size of tensor b (315392) at non-singleton dimension 0。
- 3.1.4 问题四: 训练效率问题
1.背景
上一篇文章写到,【个人开发】macbook m1 Lora微调qwen大模型
该微调方式,同样适用于GPU,只不过在train.py脚本中,针对device,调整为cuda即可。
如果数据量过大的话,单卡微调会存在瓶颈,因此考虑多GPU进行微调。
网上搜罗了一圈,多卡微调的常用方案:deepspeed+Llama-factory。
本文主要记录该方式的微调情况,仅为个人学习记录
2.微调方式
2.1 关键环境版本信息
2.2 步骤
2.2.1 下载llama-factory
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factorypip install -e \".[torch,metrics]\"
2.2.2 准备数据集
数据集采用网上流传的《甄嬛传》。
数据源地址:huanhuan.json
数据集结构如下。
// 文件命名:huanhuan.json[ { \"instruction\": \"小姐,别的秀女都在求中选,唯有咱们小姐想被撂牌子,菩萨一定记得真真儿的——\", \"input\": \"\", \"output\": \"嘘——都说许愿说破是不灵的。\" }, ...]
其次,还得准备数据集信息【dataset_info.json】,因为是本地微调,所以微调时现访问dataset_info,再指定到具体的数据集中。
{ \"identity\": { \"file_name\": \"test_data.json\" }}
注意文本的数据集的格式必须为,json,不然会报错。
2.2.3 微调模式
2.2.3.1 zero-1微调
配置参考zero-3的配置,修改了一下zero_optimization.stage的参数。
// 文件命名:ds_config_zero1.json{ \"fp16\": { \"enabled\": \"auto\", \"loss_scale\": 0, \"loss_scale_window\": 1000, \"initial_scale_power\": 16, \"hysteresis\": 2, \"min_loss_scale\": 1 }, \"bf16\": { \"enabled\": \"auto\" }, \"optimizer\": { \"type\": \"AdamW\", \"params\": { \"lr\": \"auto\", \"betas\": \"auto\", \"eps\": \"auto\", \"weight_decay\": \"auto\" } }, \"scheduler\": { \"type\": \"WarmupLR\", \"params\": { \"warmup_min_lr\": \"auto\", \"warmup_max_lr\": \"auto\", \"warmup_num_steps\": \"auto\" } }, \"zero_optimization\": { \"stage\": 1, \"offload_optimizer\": { \"device\": \"none\", \"pin_memory\": true }, \"offload_param\": { \"device\": \"none\", \"pin_memory\": true }, \"overlap_comm\": true, \"contiguous_gradients\": true, \"sub_group_size\": 1e9, \"reduce_bucket_size\": \"auto\", \"stage3_prefetch_bucket_size\": \"auto\", \"stage3_param_persistence_threshold\": \"auto\", \"stage3_max_live_parameters\": 1e9, \"stage3_max_reuse_distance\": 1e9, \"stage3_gather_16bit_weights_on_model_save\": true }, \"gradient_accumulation_steps\": 4, \"gradient_clipping\": \"auto\", \"steps_per_print\": 100, \"train_batch_size\": \"auto\", \"train_micro_batch_size_per_gpu\": \"auto\", \"wall_clock_breakdown\": false}
微调脚本
# run_train_bash_zero_1.sh#!/bin/bash# 记录开始时间START=$(date +%s.%N)CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 accelerate launch src/train.py \\ --deepspeed ds_config_zero1.json \\ --stage sft \\ --do_train True \\ --model_name_or_path /root/ai_project/fine-tuning-by-lora/models/model/qwen/Qwen2___5-7B-Instruct \\ --finetuning_type lora \\ --template qwen \\ --dataset_dir /root/ai_project/fine-tuning-by-lora/dataset/ \\ --dataset identity \\ --cutoff_len 1024 \\ --num_train_epochs 30 \\ --max_samples 100000 \\ --learning_rate 5e-05 \\ --lr_scheduler_type cosine \\ --warmup_steps 10 \\ --per_device_train_batch_size 4 \\ --gradient_accumulation_steps 4 \\ --max_grad_norm 1.0 \\ --logging_steps 10 \\ --save_steps 100 \\ --neftune_noise_alpha 0 \\ --lora_rank 8 \\ --lora_dropout 0.1 \\ --lora_alpha 32 \\ --lora_target q_proj,v_proj,k_proj,gate_proj,up_proj,o_proj,down_proj \\ --output_dir ./output/qwen_7b_ft/zero1/ \\ --bf16 True \\ --plot_loss True# 记录结束时间END=$(date +%s.%N)# 计算运行时间DUR=$(echo