大模型编程(4)- 微调

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 大模型微调学习
!pip install accelerate==1.0.1 rouge-score==0.1.2 nltk==3.9.1 ms-swift[llm]==2.4.2.post2 evalscope==0.5.5rc1

下载模型

!mkdir ./model 
!modelscope download --model qwen/Qwen2.5-1.5B-Instruct --local_dir './model'

image.png
image.png

这里已经提前准备好了一份线上教育公司相关数据库问题查询的数据集,其中大概500+作为训练集,100+作为测试集。

训练集:用于在训练阶段进行模型参数的训练。

{
   
    "messages": [
        {
   
            "role": "system",
            "content": "#背景#
                        数据库信息:{'column_names': [[-1, '*', 'text'], [0, 'address id', 'number'], [0, 'address details', 'text'], [1, 'staff id', 'number'], [1, 'staff gender', 'text'], [1, 'staff name', 'text'], [2, 'supplier id', 'number'], [2, 'supplier name', 'text'], [2, 'supplier phone', 'text'], [3, 'department store chain id', 'number'], [3, 'department store chain name', 'text'], [4, 'customer id', 'number'], [4, 'payment method code', 'text'], [4, 'customer code', 'text'], [4, 'customer name', 'text'], [4, 'customer address', 'text'], [4, 'customer phone', 'text'], [4, 'customer email', 'text'], [5, 'product id', 'number'], [5, 'product type code', 'text'], [5, 'product name', 'text'], [5, 'product price', 'number'], [6, 'supplier id', 'number'], [6, 'address id', 'number'], [6, 'date from', 'time'], [6, 'date to', 'time'], [7, 'customer id', 'number'], [7, 'address id', 'number'], [7, 'date from', 'time'], [7, 'date to', 'time'], [8, 'order id', 'number'], [8, 'customer id', 'number'], [8, 'order status code', 'text'], [8, 'order date', 'time'], [9, 'department store id', 'number'], [9, 'department store chain id', 'number'], [9, 'store name', 'text'], [9, 'store address', 'text'], [9, 'store phone', 'text'], [9, 'store email', 'text'], [10, 'department id', 'number'], [10, 'department store id', 'number'], [10, 'department name', 'text'], [11, 'order item id', 'number'], [11, 'order id', 'number'], [11, 'product id', 'number'], [12, 'product id', 'number'], [12, 'supplier id', 'number'], [12, 'date supplied from', 'time'], [12, 'date supplied to', 'time'], [12, 'total amount purchased', 'text'], [12, 'total value purchased', 'number'], [13, 'staff id', 'number'], [13, 'department id', 'number'], [13, 'date assigned from', 'time'], [13, 'job title code', 'text'], [13, 'date assigned to', 'time']], 'foreign_keys': [[22, 6], [23, 1], [26, 11], [27, 1], [31, 11], [35, 9], [41, 34], [45, 18], [44, 30], [46, 18], [47, 6], [52, 3], [53, 40]], 'primary_keys': [1, 3, 6, 9, 11, 18, 22, 26, 30, 34, 40, 43, 46, 52], 'table_names': ['addresses', 'staff', 'suppliers', 'department store chain', 'customers', 'products', 'supplier addresses', 'customer addresses', 'customer orders', 'department stores', 'departments', 'order items', 'product suppliers', 'staff department assignments']}
                        #受众#
                        Mysql数据库
                        #输出#
                        只输出SQL查询语句"
        },
        {
   
            "role": "user",
            "content": "#目的#
                        将问题\"What are the names and ids of customers whose address contains TN?\"转换为转化为SQL查询语句"
        },
        {
   
            "role": "assistant",
            "content": "SELECT customer_name ,  customer_id FROM customers WHERE customer_address LIKE \"%TN%\""
        }
    ]
}
{
   
    "messages": [
        {
   
            "role": "system",
            "content": "#背景#
                        数据库信息:{'column_names': [[-1, '*', 'text'], [0, 'address id', 'number'], [0, 'address details', 'text'], [1, 'staff id', 'number'], [1, 'staff gender', 'text'], [1, 'staff name', 'text'], [2, 'supplier id', 'number'], [2, 'supplier name', 'text'], [2, 'supplier phone', 'text'], [3, 'department store chain id', 'number'], [3, 'department store chain name', 'text'], [4, 'customer id', 'number'], [4, 'payment method code', 'text'], [4, 'customer code', 'text'], [4, 'customer name', 'text'], [4, 'customer address', 'text'], [4, 'customer phone', 'text'], [4, 'customer email', 'text'], [5, 'product id', 'number'], [5, 'product type code', 'text'], [5, 'product name', 'text'], [5, 'product price', 'number'], [6, 'supplier id', 'number'], [6, 'address id', 'number'], [6, 'date from', 'time'], [6, 'date to', 'time'], [7, 'customer id', 'number'], [7, 'address id', 'number'], [7, 'date from', 'time'], [7, 'date to', 'time'], [8, 'order id', 'number'], [8, 'customer id', 'number'], [8, 'order status code', 'text'], [8, 'order date', 'time'], [9, 'department store id', 'number'], [9, 'department store chain id', 'number'], [9, 'store name', 'text'], [9, 'store address', 'text'], [9, 'store phone', 'text'], [9, 'store email', 'text'], [10, 'department id', 'number'], [10, 'department store id', 'number'], [10, 'department name', 'text'], [11, 'order item id', 'number'], [11, 'order id', 'number'], [11, 'product id', 'number'], [12, 'product id', 'number'], [12, 'supplier id', 'number'], [12, 'date supplied from', 'time'], [12, 'date supplied to', 'time'], [12, 'total amount purchased', 'text'], [12, 'total value purchased', 'number'], [13, 'staff id', 'number'], [13, 'department id', 'number'], [13, 'date assigned from', 'time'], [13, 'job title code', 'text'], [13, 'date assigned to', 'time']], 'foreign_keys': [[22, 6], [23, 1], [26, 11], [27, 1], [31, 11], [35, 9], [41, 34], [45, 18], [44, 30], [46, 18], [47, 6], [52, 3], [53, 40]], 'primary_keys': [1, 3, 6, 9, 11, 18, 22, 26, 30, 34, 40, 43, 46, 52], 'table_names': ['addresses', 'staff', 'suppliers', 'department store chain', 'customers', 'products', 'supplier addresses', 'customer addresses', 'customer orders', 'department stores', 'departments', 'order items', 'product suppliers', 'staff department assignments']}
                        #受众#
                        Mysql数据库
                        #输出#
                        只输出SQL查询语句"
        },
        {
   
            "role": "user",
            "content": "#目的#
                        将问题\"What are the highest and lowest prices of products, grouped by and alphabetically ordered by product type?\"转换为转化为SQL查询语句"
        },
        {
   
            "role": "assistant",
            "content": "SELECT max(product_price) ,  min(product_price) ,  product_type_code FROM products GROUP BY product_type_code ORDER BY product_type_code"
        }
    ]
}

验证集:用于在训练阶段评估模型训练的效果,从而调整模型的超参数(如学习率、退火策略等)和监控过拟合情况。

训练集文件会被按照4:1的比例拆分为训练集与验证集,测试集文件则对应测试集。

测试集:用于在训练阶段完成后评估模型训练的效果。本课程提供的实验数据中,测试集涉及的数据库均没有在训练、验证数据集中出现过。

{
   
    "history": [],
    "query": "#背景#
              数据库信息:{'column_names': [[-1, '*', 'text'], [0, 'school id', 'text'], [0, 'school name', 'text'], [0, 'location', 'text'], [0, 'mascot', 'text'], [0, 'enrollment', 'number'], [0, 'ihsaa class', 'text'], [0, 'ihsaa football class', 'text'], [0, 'county', 'text'], [1, 'school id', 'number'], [1, 'year', 'number'], [1, 'budgeted', 'number'], [1, 'total budget percent budgeted', 'number'], [1, 'invested', 'number'], [1, 'total budget percent invested', 'number'], [1, 'budget invested percent', 'text'], [2, 'endowment id', 'number'], [2, 'school id', 'number'], [2, 'donator name', 'text'], [2, 'amount', 'number']], 'foreign_keys': [[9, 1], [17, 1]], 'primary_keys': [1, 9, 16], 'table_names': ['school', 'budget', 'endowment']}
              #受众#
              Mysql数据库
              #输出#
              只输出SQL查询语句
              #目的#
              将问题\"Count the number of schools.\"转换为转化为SQL查询语句\n",
    "response": "SELECT count(*) FROM school"
}
{
   
    "history": [],
    "query": "#背景#
              数据库信息:{'column_names': [[-1, '*', 'text'], [0, 'school id', 'text'], [0, 'school name', 'text'], [0, 'location', 'text'], [0, 'mascot', 'text'], [0, 'enrollment', 'number'], [0, 'ihsaa class', 'text'], [0, 'ihsaa football class', 'text'], [0, 'county', 'text'], [1, 'school id', 'number'], [1, 'year', 'number'], [1, 'budgeted', 'number'], [1, 'total budget percent budgeted', 'number'], [1, 'invested', 'number'], [1, 'total budget percent invested', 'number'], [1, 'budget invested percent', 'text'], [2, 'endowment id', 'number'], [2, 'school id', 'number'], [2, 'donator name', 'text'], [2, 'amount', 'number']], 'foreign_keys': [[9, 1], [17, 1]], 'primary_keys': [1, 9, 16], 'table_names': ['school', 'budget', 'endowment']}
              #受众#
              Mysql数据库
              #输出#
              只输出SQL查询语句
              #目的#
              将问题\"Show all donor names.\"转换为转化为SQL查询语句",
    "response": "SELECT DISTINCT donator_name FROM endowment"
}

先评测

!mkdir -p eval_outputs
%env LOG_LEVEL=WARNING
!swift eval \
--model_id_or_path './model' \
--model_type 'qwen2_5-1_5b-instruct' \
--eval_dataset no \
--custom_eval_config 'resources/2_4/data/config_eval.json' \
--max_length -1 \
--system '' \
--infer_backend 'pt' \
--name 'pre_train_evaluation' \
--eval_output_dir './eval_outputs'

image.png
image.png
在完成了模型的评测后,就可以开始对模型进行微调了。swift提供了操作简单的微调工具,你只需要传入训练集、模型路径等参数。同时swift框架在微调时默认使用LoRA方法,在命令中不需要额外声明。

微调命令:

%env CUDA_VISIBLE_DEVICES=0
%env LOG_LEVEL=INFO
!mkdir -p logs
!swift sft \
--dataset 'resources/2_4/data/train.jsonl' \
--learning_rate '1e-4' \
--eval_steps '10' \
--batch_size '4' \
--model_type 'qwen2_5-1_5b-instruct' \
--max_length 2048 \
--model_id_or_path './model' \
--num_train_epochs 3

微调后一般会保存两个checkpoint文件,分别是best_model_checkpoint(在验证集表现最佳的微调模型)与last_model_checkpoint(最后一次保存的checkpoint)。

[INFO:swift] last_model_checkpoint: /mnt/workspace/aliyun_acp_learning/大模型ACP认证教程/p2_构造大模型问答系统/output/qwen2_5-1_5b-instruct/v1-20250106-161819/checkpoint-102
[INFO:swift] best_model_checkpoint: /mnt/workspace/aliyun_acp_learning/大模型ACP认证教程/p2_构造大模型问答系统/output/qwen2_5-1_5b-instruct/v1-20250106-161819/checkpoint-90

微调之后再测评

!mkdir -p eval_outputs
%env LOG_LEVEL=WARNING
!swift eval \
--ckpt_dir 'output/qwen2_5-1_5b-instruct/v1-20250106-161819/checkpoint-102' \
--eval_dataset no \
--custom_eval_config 'resources/2_4/data/config_eval.json' \
--max_length -1 \
--system '' \
--infer_backend 'pt' \
--name 'pre_train_evaluation' \
--eval_output_dir './eval_outputs'

image.png
可以看到,Rouge-L分数都有了非常大的提升,几乎翻倍,说明经过微调后的模型NL2SQL的能力得到了大幅度的加强。

模型微调训练完成后,将基础模型与微调得到的低秩参数融合,获得一个完整的、更新了参数的模型,再调用融合了的模型。

%env LOG_LEVEL=INFO
!swift export \
--ckpt_dir 'output/qwen2_5-1_5b-instruct/v1-20250106-161819/checkpoint-102' \
--merge_lora true

image.png

微调数据集构建策略

一般来说,在比较复杂的场景中,微调至少需要1000+条优质的训练集数据。构建数据集时,请确认以下几点:

  • 数据质量:确保数据集的准确性和相关性,避免模糊和错误内容。

  • 数据多样性:覆盖任务的所有关键方面和潜在变化,包括不同场景、语境和专业术语。

  • 平衡性:如果任务涉及多种类别场景,确保各类别样本均衡,防止模型偏向于某一类。

  • 持续迭代:微调是一个迭代过程,根据模型在验证集上的表现反馈,不断优化和扩大数据集。

而如果你在进行模型微调时缺乏数据,建议你使用知识库检索来增强模型能力。

在很多复杂的业务场景中,可以综合采用模型调优和知识库检索相结合的技术方案。

你也可以采用以下策略扩充数据集:

  1. 联系数据专家或数据团队基于已有数据,制作更多的典型场景数据。

  2. 让能力更强的大模型模拟生成特定业务/场景的相关内容,辅助你生成更多可用于微调的数据。

  3. 通过应用场景收集、网络爬虫、社交媒体和在线论坛、公开数据集、合作伙伴与行业资源、用户贡献等方式获取更多数据。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8月前
|
人工智能 自然语言处理 物联网
RoSA: 一种新的大模型参数高效微调方法
随着语言模型不断扩展到前所未有的规模,对下游任务的所有参数进行微调变得非常昂贵,PEFT方法已成为自然语言处理领域的研究热点。PEFT方法将微调限制在一小部分参数中,以很小的计算成本实现自然语言理解任务的最先进性能。
196 1
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
LLM 大模型学习必知必会系列(一):大模型基础知识篇
LLM 大模型学习必知必会系列(一):大模型基础知识篇
LLM 大模型学习必知必会系列(一):大模型基础知识篇
|
5月前
|
机器学习/深度学习 自然语言处理 数据处理
|
6月前
|
机器学习/深度学习 自然语言处理 Swift
从头构建和训练 GPT-2 |实战
从头构建和训练 GPT-2 |实战
69 4
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
基于PAI 低代码实现大语言模型微调和部署
【8月更文挑战第10天】基于PAI 低代码实现大语言模型微调和部署
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
【AI大模型】Transformers大模型库(九):大模型微调之计算微调参数占比
【AI大模型】Transformers大模型库(九):大模型微调之计算微调参数占比
68 0
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】GLM4-9B-Chat大模型/GLM-4V-9B多模态大模型概述、原理及推理实战
【机器学习】GLM4-9B-Chat大模型/GLM-4V-9B多模态大模型概述、原理及推理实战
517 0
|
5月前
|
机器学习/深度学习 数据采集 人工智能
【AI大模型】Transformers大模型库(十一):Trainer训练类
【AI大模型】Transformers大模型库(十一):Trainer训练类
130 0
|
8月前
|
机器学习/深度学习 人工智能 PyTorch
LLM 大模型学习必知必会系列(四):LLM训练理论篇以及Transformer结构模型详解
LLM 大模型学习必知必会系列(四):LLM训练理论篇以及Transformer结构模型详解
LLM 大模型学习必知必会系列(四):LLM训练理论篇以及Transformer结构模型详解
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
LLM资料大全:文本多模态大模型、垂直领域微调模型、STF数据集、训练微调部署框架、提示词工程等
LLM资料大全:文本多模态大模型、垂直领域微调模型、STF数据集、训练微调部署框架、提示词工程等
LLM资料大全:文本多模态大模型、垂直领域微调模型、STF数据集、训练微调部署框架、提示词工程等