当前位置:AIGC资讯 > AIGC > 正文

llamafactory-llama3微调中文数据集

一、定义

https://github.com/SmartFlowAI/Llama3-Tutorial/tree/main

基准模型测试 opencompass 离线测评 数据准备 微调训练 合并 测试 人工审核对比

二、实现

基准模型测试
基准模型 llama3-8b
https://zhuanlan.zhihu.com/p/694818596?
https://github.com/SmartFlowAI/Llama3-Tutorial/blob/main/docs/opencompass.md
https://github.com/InternLM/Tutorial/blob/camp2/data_fine_tuning/data_fine_tuning.md
CUDA_VISIBLE_DEVICES=0 llamafactory-cli eval \
--model_name_or_path /home/Meta-Llama-3-8B-Instruct \
--template llama3 \
--task triviaqa \
--split validation \
--lang en \
--n_shot 5 \
--batch_size 1


个人认为,虽然epoch=1 在标准指标中中文评估能力大于epoch=3,但人工审核过程中,epoch =3 在中文表达上更满足人的需求。随着训练轮次的增加,模型更倾向于表达中文。

opencompass 离线测评
部署见opencompass 配置篇
from mmengine.config import read_base

with read_base():
    from .datasets.mmlu.mmlu_gen_4d595a import mmlu_datasets

datasets = [*mmlu_datasets]

from opencompass.models import HuggingFaceCausalLM

batch_size = 20
# 指定评测模型
model_name_or_paths = [                              #可以多个模型
    '/home/Meta-Llama-3-8B-Instruct'
]
models = []   #模型以及配置放于列表中

for model_name_or_path in model_name_or_paths:
    abbr = model_name_or_path.split('/')[-1]
    model = dict(
        type=HuggingFaceCausalLM,
        abbr=abbr,
        path=model_name_or_path,
        tokenizer_path=model_name_or_path,
        tokenizer_kwargs=dict(padding_side='left',
                              truncation_side='left',
                              use_fast=False,
                              trust_remote_code=True
                              ),
        max_out_len=1024,
        max_seq_len=2048,
        batch_size=batch_size,
        model_kwargs=dict(device_map='auto', trust_remote_code=True),
        batch_padding=False,  # if false, inference with for-loop without batch padding
        run_cfg=dict(num_gpus=2, num_procs=2),
    )
    models.append(model)
    
# python run.py configs/eval_llama3_8b_demo.py
数据准备
https://github.com/InternLM/Tutorial/blob/camp2/data_fine_tuning/data_fine_tuning.md
https://modelscope.cn/datasets/baicai003/Llama3-Chinese-dataset/summary
https://huggingface.co/datasets/m-a-p/COIG-CQIA
import datasets
data=datasets.load_dataset("llamafactory/alpaca_gpt4_zh")
data=data["train"]
res=[]
for i in range(len(data)):
    res.append(data[i])
import json
with open('alpaca_gpt4_zh.json', 'w',encoding="utf8") as file:
    # 使用缩进格式化输出 JSON 数据
    json.dump(res, file, indent=4,ensure_ascii=False)
#42677
"alpaca_gpt4_zh_local": {
    "file_name": "alpaca_gpt4_zh.json"
  }
  
  #16493
  "Llama3-Chinese-dataset_local": {
    "file_name": "Llama3-Chinese-dataset.json"
  }
  #11262
    "COIG-CQIA_local": {
    "file_name": "COIG-CQIA.json"
  }
  #51983
  "alpaca_gpt4_en_local": {
    "file_name": "alpaca_gpt4_en.json"
  }
微调训练
#lora 双卡微调
CUDA_VISIBLE_DEVICES=0,1 nohup llamafactory-cli train \
    --stage sft \
    --do_train \
    --model_name_or_path /home/Meta-Llama-3-8B-Instruct \
    --dataset alpaca_gpt4_zh_local,Llama3-Chinese-dataset_local,COIG-CQIA_local,alpaca_gpt4_en_local  \
    --dataset_dir ./data \
    --template llama3 \
    --finetuning_type lora \
    --output_dir ./saves/LLaMA3-8B/lora/sft \
    --overwrite_cache \
    --overwrite_output_dir \
    --cutoff_len 1024 \
    --preprocessing_num_workers 16 \
    --per_device_train_batch_size 4 \
    --per_device_eval_batch_size 2 \
    --gradient_accumulation_steps 8 \
    --lr_scheduler_type cosine \
    --logging_steps 50 \
    --warmup_steps 20 \
    --save_steps 100 \
    --eval_steps 50 \
    --evaluation_strategy steps \
    --load_best_model_at_end \
    --learning_rate 5e-5 \
    --num_train_epochs 3.0 \
    --val_size 0.1 \
    --plot_loss \
    --fp16> output.log 2>&1 &
#3 个epoch 有些过拟合,采用1个epoch
CUDA_VISIBLE_DEVICES=0,1 nohup llamafactory-cli train \
    --stage sft \
    --do_train \
    --model_name_or_path /home/Meta-Llama-3-8B-Instruct \
    --dataset alpaca_gpt4_zh_local,Llama3-Chinese-dataset_local,COIG-CQIA_local,alpaca_gpt4_en_local  \
    --dataset_dir ./data \
    --template llama3 \
    --finetuning_type lora \
    --output_dir ./saves/LLaMA3-8B/lora/sft_1 \
    --overwrite_cache \
    --overwrite_output_dir \
    --cutoff_len 1024 \
    --preprocessing_num_workers 16 \
    --per_device_train_batch_size 4 \
    --per_device_eval_batch_size 2 \
    --gradient_accumulation_steps 8 \
    --lr_scheduler_type cosine \
    --logging_steps 50 \
    --warmup_steps 20 \
    --save_steps 100 \
    --eval_steps 50 \
    --evaluation_strategy steps \
    --load_best_model_at_end \
    --learning_rate 5e-5 \
    --num_train_epochs 1.0 \
    --val_size 0.1 \
    --plot_loss \
    --fp16> output.log 2>&1 &
合并
CUDA_VISIBLE_DEVICES=0 llamafactory-cli export \
    --model_name_or_path /home/Meta-Llama-3-8B-Instruct \
    --adapter_name_or_path ./saves/LLaMA3-8B/lora/sft  \
    --template llama3 \
    --finetuning_type lora \
    --export_dir megred-model-path-1 \
    --export_size 2 \
    --export_device cpu \
    --export_legacy_format False
测试
微调后:
CUDA_VISIBLE_DEVICES=0 llamafactory-cli chat \
    --model_name_or_path megred-model-path  \
    --template llama3 





微调前:

CUDA_VISIBLE_DEVICES=0 llamafactory-cli eval \
--model_name_or_path megred-model-path \
--template llama3 \
--task mmlu \
--split validation \
--lang en \
--n_shot 5 \
--batch_size 1


7. 人工审核对比

总结

### 文章总结
**文章标题**: LLAMA3 模型详细流程与实施步骤
**核心要点**:
1. **定义与流程**:
- **基准模型测试**:使用 llama3-8b 基准模型进行测试,评估其在特定任务(如 triviaqa)上的性能。调整 epoch (训练周期),结合实际中文表达效果,选择最优的 epoch 设置。
- **opencompass 离线测评**:通过配置 opencompass 进行离线模型评估。设定测试数据集和模型参数,加载并运行评测脚本。
- **数据准备**:整合了多个数据集资源(如 alpaca_gpt4_zh, Llama3-Chinese-dataset, COIG-CQIA 等),用于后续的微调训练。
- **微调训练**:采用 lora(低秩自适应)方式进行微调,利用上述准备的数据集对模型进行训练,并通过比较不同 epoch 的测试结果,确定适合的训练周期。
- **合并**:将微调后的适配器模型与原始基础模型合并,生成可用于实际测试或部署的完整模型。
- **测试与人工审核对比**:通过自动评估和人工审核,对新老模型(微调前与微调后)进行对比,验证微调的效果和模型性能的提升。
2. **具体实现步骤**:
- **基准模型测试**:通过 llamafactory-cli 工具,加载并评估基准模型在特定任务上的表现。
- **opencompass 离线测评**:配置并运行 opencompass 进行离线评估,指定模型和数据集等信息。
- **数据准备**:使用 datasets 库加载和处理的数据集,并将其保存为 JSON 格式文件,供微调训练使用。
- **微调训练**:通过 lamafactory-cli 进行 lora 微调训练,调整不同参数如批处理大小、学习率、训练周期等以获得最佳效果。
- **合并**:导出微调后的适配器模型,并将其与基础模型合并,生成最终可部署的模型。
- **测试**:通过 llamafactory-cli 进行聊天或评估任务,检验微调后模型的实际表现。
- **人工审核对比**:对比微调前后的模型表现,特别是在中文表达和特定任务上的性能差异。
3. **关键参数和指令说明**:
- 各类 CUDA、数据集路径、模型路径、输出目录、批处理大小、学习率、训练周期等关键配置的设定与调整。
- `llamafactory-cli` 工具的使用,包括 eval, train, export, chat 等指令的实际应用示例。
4. **关键发现和结论**:
- 适当调整训练周期(如从 3 个 epoch 减少到 1 个 epoch)可以避免过拟合,并提高模型在中文表达上的表现。
- 通过基准模型测试、数据准备、微调训练和人工审核等多步骤流程,可以有效提升模型在特定任务上的性能表现。
5. **适用场景和实用价值**:
- 该流程适用于需要在大规模基础模型上进行定制化微调的场景,如生成式 AI 任务、语言处理任务等。
- 通过精细的调参和人工审核,可以为不同类型的实际应用提供定制化、高性能的 AI 模型。

更新时间 2024-09-14