> 技术文档 > 【个人开发】deepspeed+Llama-factory 本地数据多卡Lora微调【完整教程】_llamafactory deepspeed

【个人开发】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 关键环境版本信息

模块 版本 python 3.10 CUDA 12.6 torch 2.5.1 peft 0.12.0 transformers 4.46.2 accelerate 1.1.1 trl 0.9.6 deepspeed 0.15.4

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