昇腾社区首页
中文
注册
基于应用使能套件的行业模型微调实践

基于应用使能套件的行业模型微调实践

微调应用使能套件

发表于 2025/05/29

1、引言

目前业界的模型微调实践主要集中在特定任务,行业模型的开发实践较少,一方面由于领域知识复杂、高质量数据稀缺、模型性能难以评估导致开发技术要求高、流程复杂,另一方面行业模型开发完成通常会直接应用该领域,导致开发细节较少公开。

本文以法律行业为背景,介绍利用应用使能套件开发行业模型微调训练的端到端流程,开发的模型在LawBench法律评测数据集上获得了16.57分的提升,能在法律领域具备更高专业性,帮助用户解决法律相关专业问题。


2、实践任务介绍

本实践以魔乐社区的law_mini_data法律数据集+Qwen2.5-7B-Instruct模型为例,介绍了数据集构建、二次预训练、微调以及模型评估的全流程,帮助开发者更好地理解端到端行业模型的微调开发流程,同时开发者也可以基于本案例自己手动复现全流程。本教程将包括如下内容:
1. 法律领域任务介绍,包括任务说明、指标和数据样例
2. 资源依赖和评估结果,包括机器资源、训练数据集、基座模型、训练套件、评估套件和评估结果等
3. 实验流程,包含开发环境配置、训练、评估等
本实践使用OpenCompass和LawBench评测集来评测模型在法律领域的能力。OpenCompass是一个开源的大模型评测平台,支持多种数据集和模型的评估,已支持昇腾NPU,同时支持LawBench评测。LawBench是一个针对中国法律体系设计的深度学习基准评测平台,旨在全面评估大型语言模型(LLMs)的法律知识、理解和应用能力。该平台精心设计了20个任务,覆盖了从简单的法律知识记忆到复杂的法律知识理解和应用,全方位评估模型的表现,具体的法律任务和指标参考,LawBench数据集-任务列表:https://github.com/open-compass/LawBench/blob/main/README.md
评测数据可参考LawBench/data,每个任务对应一个json文件,数据格式如下(以1-1法条背诵任务为例):
评测数据:https://github.com/open-compass/LawBench/tree/main/data

{
    "instruction": "回答以下问题,只需直接给出法条内容:下面是一个例子:\n民法商法公司法第六十条的内容是什么?\n答案:一人有限责任公司章程由股东制定。\n请你回答:",
    "question": "民法商法农民专业合作社法第十四条的内容是什么?",
    "answer": "答案:设立农民专业合作社,应当召开由全体设立人参加的设立大会。设立时自愿成为该社成员的人为设立人。,设立大会行使下列职权:,(一)通过本社章程,章程应当由全体设立人一致通过;,(二)选举产生理事长、理事、执行监事或者监事会成员;,(三)审议其他重大事项。"
}


3、资源依赖和评估结果

3.1 机器资源
本实践所需的机器资源为单台昇腾Atlas 900 A2 POD单机八卡


3.2 训练数据集
本实践采用的数据集为魔乐社区的law_mini_data数据集,该数据集根据lawbench数据集来源进行构造,并剔除了用于评测的数据。数据共包含预训练与微调两部分,其中:
pretrain文件夹存放的law_mini_pretrain_data.json数据集用于领域预训练。
finetune文件夹存放的law_mini_finetune_data.json数据集和general_field_mini_finetune_data.json数据集分别用于法律领域微调和通用领域微调。
用户可在此处下载该数据集,本实践以数据集保存至/home/law/law_mini_data路径为例。
数据集下载地址:https://modelers.cn/datasets/AI-Research/law_mini_data
3.2.1数据示例与构建方式
3.2.1.1预训练数据
数据示例如下:


数据构建方式:
通过LawRefBook,JEC-QA,DISC-Law-SFT(判决预测,司法摘要,法律考试,法律问答)源数据构建,总数据量大约在170k左右。
3.2.1.2法律微调数据
数据示例如下:


数据构建方式:
针对LawBench每个任务的数据来源构建对应的微调数据集。例如,给定数据集D有10000条数据,假设任务A选取数据集D其中500条进行评估,则微调数据集A'从剩下的9500条中随机抽取一定的样本,仿照任务A的形式构建微调数据。采样方式为:随机抽取2000条数据,不足2000条数据则使用全量数据,共构建32774条领域微调数据。
3.2.1.3通用任务微调数据
数据示例如下:


数据构建方式:
取自BAAI/Infinity-Instruct数据集,由智源研究院发布,包括Infinity-Instruct-7M基础指令数据集和Infinity-Instruct-Gen对话指令数据集,中英文微调数据各选取 32774 条。
微调数据中,中文:英文:领域 = 1:1 :1。


3.3 基座模型
Instruct模型相比base模型能够更好地理解和执行复杂的自然语言指令。本实践为了开发出更优秀的行业模型,采用的基座模型为Qwen2.5-7B-Instruct,用户可在魔乐社区下载该模型权重文件,本实践以模型保存到/home/law/Qwen2.5-7B-Instruct路径为例。
模型权重下载地址:https://modelers.cn/models/AI-Research/Qwen2.5-7B-Instruct


3.4 训练套件
本实践以应用使能套件作为预训练与微调套件,该套件基于Transformers框架和常用的开源技术栈,更好的支持HF格式模型,可以提供简化的训练流程,无需配置复杂的并行化策略,适合快速开发中小型模型的训练和部署,具有良好的易用性,包含了常用的模型预训练、微调、模型合并、推理等功能。
套件开源仓地址:https://gitee.com/ascend/openmind


3.5 评估套件
本实践采用的评估套件为OpenCompass,OpenCompass是由上海人工智能实验室研发的大模型评测一站式平台,提供公平、公开、可复现的大模型评测方案,支持70+数据集和20+Huggingface及API模型。当前,OpenCompass已经原生支持昇腾NPU,通过简单的配置,即可在昇腾NPU上使用OpenCompass评测大模型的能力。
OpenCompass网址:https://github.com/open-compass/opencompass/tree/main


3.6 评估结果
部分评估结果见下表所示,详细评估结果见魔乐社区数据集介绍,表中红色表示相较于基准模型,分数劣化,绿色表示相较于基准模型,分数提升。
数据集地址:https://modelers.cn/datasets/AI-Research/law_mini_data
3.6.1 法律行业能力评估结果

法律行业能力评估
datasetmetricmode基座模型Qwen2.5-7B-Instruct微调1 epoch与基座模型差距预训练2epoch后,微调1 epoch与基座模型差距预训练后微调与直接微调差距
--------- 0-shot -----------------
lawbench-0-shotnaive_averagegen52.2865.5313.2570.7118.435.18
lawbench-1-1-article_recitation-0-shotscoregen23.231.688.4888.3465.1456.66
lawbench-1-2-knowledge_question_answering-0-shotscoregen67.675.47.89325.417.6
lawbench-3-7-criminal_damages_calculation-0-shotscoregen66.880.81479.212.4-1.6
lawbench-3-8-consultation-0-shotscoregen22.0619.46-2.620.08-1.980.62
--------- 1-shot -----------------
lawbench-1-shotnaive_averagegen55.2765.6510.3869.9814.714.33
lawbench-1-1-article_recitation-1-shotscoregen21.0930.649.5582.0160.9251.37
lawbench-1-2-knowledge_question_answering-1-shotscoregen6775.48.490.623.615.2
lawbench-3-7-criminal_damages_calculation-1-shotscoregen69.679.49.877.47.8-2
lawbench-3-8-consultation-1-shotscoregen23.3519.84-3.5120.81-2.540.97
平均值--55.7765.5911.8270.3516.574.75


3.6.2 通用领域评估结果

datasetmetricmode基座模型Qwen2.5-7B-Instruct微调1epoch与基座模型差距预训练后微调1 epoch与基座模型差距预训练后微调与直接微调差距
平均值--75.6675.900.2473.99-1.67-1.91

我们发现在法律行业方面,直接进行SFT微调,与进行二次预训练后,再进行SFT微调,均能够获得较高的行业能力提升,相比较而言,进行二次预训练后的SFT微调,能够获得更好的性能提升。
而对于通用能力方面,在进行了行业模型的SFT微调后,并没有对通用能力造成显著影响。在120个评估任务中,直接进行SFT微调的模型,评估平均分数增加了0.24,二次预训练后微调的模型,评估平均分数也只下降了1.67。
而对于行业能力评估,直接进行SFT微调能够获得11.82的平均分提升,二次预训练后微调,更是获得了16.57的平均分提升。



4、实验流程

本实践涉及的实验包含两部分:训练与评估。
训练包括:先做二次预训练,再做行业+通用领域的SFT微调。
评估包括:LawBench法律领域的大语言模型综合评估;通用领域评估


4.1 开发环境配置
关键版本依赖

软件版本
Python3.10
PyTorch2.1.0
Transformers4.47.1
CANN8.1.RC1
应用使能套件1.1.0


4.1.1 CANN环境参考官方指导
CANN环境准备:
https://www.hiascend.com/document/detail/zh/canncommercial/81RC1/softwareinst/instg/instg_0000.html?Mode=PmIns&InstallType=local&OS=Ubuntu&Software=cannToolKit
4.1.2 应用使能套件源码安装
该步骤会自动安装torch和torch_npu

git clone -b 1.1.0 https://gitee.com/ascend/openmind.git
cd openmind
pip install .[pt]

4.1.3 OpenCompass安装与环境配置

git clone https://github.com/open-compass/opencompass.git
cd opencompass
pip install -e .

OpenCompass安装完成后,还需要下载通用领域评估集、LawBench评估集和安装Humaneval及其相关依赖。我们在OpenCompass文件夹执行:
(1)准备通用领域评估集

wget https://github.com/open-compass/opencompass/releases/download/0.2.2.rc1/OpenCompassData-core-20240207.zip
unzip OpenCompassData-core-20240207.zip

(2)准备LawBench评估集

git clone https://github.com/open-compass/LawBench.git
mkdir ./data/lawbench
cp -r ./LawBench/data/zero_shot ./data/lawbench
cp -r ./LawBench/data/one_shot ./data/lawbench
mkdir ./data/lawbench/eval_assets
cp -r ./LawBench/evaluation/utils/data/* ./data/lawbench/eval_assets

(3)安装Humaneval及其相关依赖:

git clone https://github.com/open-compass/human-eval.git
pip install -e human-eval

(4)pip安装如下依赖包:

pip install rouge_chinese==1.0.3 cn2an==0.5.22 ltp==4.2.13 python-Levenshtein==0.21.1 pypinyin==0.49.0 tqdm==4.64.1 timeout_decorator==0.5.0


4.1 训练
经过实验尝试,我们发现只进行SFT微调在个别行业任务的提升效果一般,所以改进了方法,先进行二次预训练再进行SFT微调,通过二次预训练来丰富7B模型的语言能力,进而再通过微调来提升模型性能。


4.2.1二次预训练
(1)在应用使能套件源码目录下新建qwen2.5-pretrain.yaml文件,内容如下:

# model_name_or_path请传入本地模型路径
model_name_or_path: /home/law/Qwen2.5-7B-Instruct
# method
stage: pt
do_train: true
finetuning_type: full
template: qwen
# deepspeed配置路径,应用使能套件代码仓下已有
deepspeed: examples/deepspeed/ds_z3_config.json
trust_remote_code: True
# dataset请传入law_mini_pretrain_data.json本地路径
dataset: /home/law/law_mini_data/pretrain/law_mini_pretrain_data.json
cutoff_len: 4096
max_length: 4096
# output
logging_steps: 1
overwrite_output_dir: true
output_dir: saves/Qwen2.5-7B-Instruct-pretrain-epoch1
# train
per_device_train_batch_size: 2
gradient_accumulation_steps: 1
learning_rate: 1.0e-5
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
num_train_epochs: 2
seed: 1234
save_strategy: "epoch"

训练参数说明可以参考,应用使能套件训练参数,其中:
 model_name_or_path:待微调的模型路径,例如:/home/law/Qwen2.5-7B-Instruct
 stage:训练阶段,预训练设置为pt
 dataset:数据集路径,例如:/home/law/law_mini_data/pretrain/law_mini_pretrain_data.json
 output_dir:模型保存权重路径,例如:saves/Qwen2.5-7B-Instruct-pretrain-epoch1
(2) 完成上述配置后,在应用使能套件的源码目录下通过如下命令即可启动二次预训练:

openmind-cli train qwen2.5-pretrain.yaml

4.2.2 行业+通用域SFT微调
(1)在3.1中准备好的law_mini_data数据集文件夹下,新建dataset_info.json文件,并填入如下内容:

{
  "law_mini_finetune_data": {
    "file_name": "law_mini_finetune_data.json",
    "local_path": "/home/law/law_mini_data/finetune",
     "columns": {
      "prompt": "instruction",
      "query": "question",
      "response": "answer",
      "system": "system",
      "tools": "tools",
      "history": "history"
    }
  },
   "general_field_mini_finetune_data": {
    "local_path": "/home/law/law_mini_data/finetune",
    "file_name": "general_field_mini_finetune_data.json",
    "formatting": "sharegpt",
    "columns": {
      "messages": "conversations",
      "system": "system",
      "tools": "tools"
    }
  }
}

其中local_path传入本地数据集路径,例如:/home/law/law_mini_data/finetune。
(2)在应用使能套件的源码目录下新建openmind-cli train qwen2.5-pretrain+sft.yaml文件,文件内容如下:

# model_name_or_path请传入本地模型路径
model_name_or_path: saves/Qwen2.5-7B-Instruct-pretrain-epoch1/checkpoint-24380/
# method
stage: sft
do_train: true
finetuning_type: full
template: qwen
# deepspeed配置路径,应用使能套件代码仓下已有
deepspeed: examples/deepspeed/ds_z3_config.json
trust_remote_code: True
#custom_dataset_info请传入步骤(1)中的dataset_info.json的路径 
custom_dataset_info: /home/law/law_mini_data/dataset_info.json
# dataset请传入步骤(1)文件中的数据集名称
dataset: law_mini_finetune_data, general_field_mini_finetune_data
cutoff_len: 4096
max_length: 4096
# output
logging_steps: 1
overwrite_output_dir: true
output_dir: saves/Qwen2.5-7B-Instruct-pretrain_sft
# train
per_device_train_batch_size: 2
gradient_accumulation_steps: 1
learning_rate: 1.0e-6
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
num_train_epochs: 1
seed: 1234
save_strategy: "epoch"

其中
 model_name_or_path:需改为二次预训练后保存的权重路径,例如:saves/Qwen2.5-7B-Instruct-pretrain-epoch1/checkpoint-24380/
 stage:训练阶段,微调设置为sft
 cunstom_dataset_info:步骤(1)中自定义数据集配置文件路径,例如:/home/law/law_mini_data/dataset_info.json
 dataset:自定义数据集配置文件中数据集名称,例如:law_mini_finetune_data, general_field_mini_finetune_data
 output_dir:模型保存权重路径,例如:saves/Qwen2.5-7B-Instruct-pretrain_sft
(3)在配置完环境和微调配置文件后,在应用使能套件的源码目录下通过如下命令启动微调训练:

openmind-cli train qwen2.5-pretrain+sft.yaml

4.3 评估
   本次实践中,我们使用OpenCompass工具,对大模型的法律领域能力和通用领域能力进行评估。在用户完成4.1.3节中相关的环境配置后,需要通过如下步骤完成OpenCompass评估脚本配置(如下操作均在OpenCompass目录下进行):


4.3.1 法律行业能力评估
(1) 修改examples/eval_qwen_7b_chat_lawbench.py,内容如下:

from mmengine.config import read_base
with read_base():
    from opencompass.configs.datasets.lawbench.lawbench_one_shot_gen_002588 import \
        lawbench_datasets as lawbench_one_shot_datasets
    from opencompass.configs.datasets.lawbench.lawbench_zero_shot_gen_002588 import \
        lawbench_datasets as lawbench_zero_shot_datasets
    #from opencompass.configs.models.qwen.hf_qwen_7b_chat import models
    from opencompass.configs.models.qwen.hf_qwen2_7b_instruct_law import models
    from opencompass.configs.summarizers.lawbench import summarizer
datasets = lawbench_zero_shot_datasets + lawbench_one_shot_datasets
for d in datasets:
    d['infer_cfg']['inferencer']['save_every'] = 1

(2) 新建opencompass/configs/models/qwen/hf_qwen2_7b_instruct_law.py,内容如下,
其中:
 path字段需要修改为待评测的模型路径

from opencompass.models import HuggingFaceCausalLM
_meta_template = dict(
	round=[
        dict(
            role="SYSTEM",
            prompt="You are a helpful assistant.",
            begin="<|im_start|>system\n",
            end="<|im_end|>\n",
        ),
        dict(role="HUMAN", begin="<|im_start|>user\n", end="<|im_end|>\n"),
        dict(
            role="BOT",
            begin="<|im_start|>assistant\n",
            end="<|im_end|>\n",
            generate=True,
        ),
    ],
    eos_token_id=151645
)
models = [
    dict(
        type=HuggingFaceCausalLM,
        abbr="qwen2_7b_instruct_law",        
        path="/home/law/Qwen2.5-7B-Instruct", #填写待评测的本地权重路径
        tokenizer_kwargs=dict(
            padding_side="left",
            truncation_side="left",
            trust_remote_code=True,
            use_fast=False,
        ),
        meta_template=_meta_template,
        max_seq_len=8192,
        max_out_len=1024,
        batch_size=1,
        batch_padding=True,
        run_cfg=dict(num_gpu=1),
        model_kwargs=dict(
            torch_dtype="torch.float",
            device_map="npu",
        ),
    )
]

(3) 配置完上述文件后,通过如下命令启动评估:

python run.py examples/eval_qwen_7b_chat_lawbench.py --debug

4.3.2 通用领域评估
(1)新建examples/eval_qwen2_7b_instruct_general_field.py,内容如下:

from mmengine.config import read_base
with read_base():
    from opencompass.configs.models.qwen.hf_qwen2_7b_instruct_general import models
    from opencompass.configs.datasets.ceval.ceval_gen import ceval_datasets
    from opencompass.configs.datasets.mmlu.mmlu_gen_4d595a import mmlu_datasets
    from opencompass.configs.datasets.gpqa.gpqa_openai_simple_evals_gen_5aeece import gpqa_datasets
    from opencompass.configs.datasets.gsm8k.gsm8k_gen_1d7fe4 import gsm8k_datasets
    from opencompass.configs.datasets.humaneval.humaneval_gen_8e312c import humaneval_datasets
    from opencompass.configs.datasets.mbpp.sanitized_mbpp_mdblock_gen_a447ff import sanitized_mbpp_datasets
    from opencompass.configs.datasets.math.math_0shot_gen_393424 import math_datasets
datasets = ceval_datasets + mmlu_datasets  + gpqa_datasets + \
           gsm8k_datasets + humaneval_datasets + sanitized_mbpp_datasets + math_datasets

(2) 新建opencompass/configs/models/qwen/hf_qwen2_7b_instruct_general.py,内容同4.3.1节步骤(2),其中path字段需要修改为待评测的模型路径。
(3) 配置完上述文件后,通过如下命令启动评估:

python run.py examples/eval_qwen2_7b_instruct_general_field.py --debug

 若遇到gpqa数据集自动下载失败问题,可通过手动下载该数据集并上传至data/gpqa路径解决。
gpqa数据集下载地址:http://opencompass.oss-cn-shanghai.aliyuncs.com/datasets/data/gpqa.zip

本页内容