Ubuntu22.04本地部署qwen模型、jupyterlab开发环境、LoRA微调全流程-续

接上一篇博客。现在开始准备数据,进行Qwen模型的LoRA微调。

准备微调环境及微调数据

准备微调环境

Qwen微调环境要求为:

降级pydantic为2.0以下

先查看版本:

复制代码
pip show pydantic

可以通过试错的方式验证当前这个包有哪些版本:

复制代码
pip install pydantic==

这里选择1.10.10的版本:

复制代码
pip install pydantic==1.10.10

安装合适版本的deepspeed(采用多GPU的需要,实现了多卡的并行加速,负载均衡等)

复制代码
pip install deepspeed==0.10.0

同样的方式安装peft:

查看有哪些版本:

复制代码
pip install peft==

选择0.6.2

复制代码
pip install peft==0.6.2

微调数据准备

Qwen模型微调数据格式:

我们选择一个开源中文医疗问答数据集:

网址:wjjingtian/cMQA: 中文医疗问答数据集 (github.com)

直接git clone:

复制代码
git clone https://github.com/wjjingtian/cMQA

多尝试几次就能下载成功:

解压文件:

复制代码
unzip questions.zip

我们可以查看一下下载的数据:

问题:

复制代码
import pandas as pd
question_file_path = './cMQA/questions.csv'
question_df = pd.read_csv(question_file_path)
print(question_df.head(10))

答案:

复制代码
ans_file_path = './cMQA/answers.csv'
ans_df = pd.read_csv(ans_file_path)
print(ans_df.head(10))

可以看到该数据集是根据question_id和ans_id一一对应的。

我们需要将其转换为Qwen模型可以进行训练的格式:

采用pd的DataFrame

复制代码
# 合并问题和答案 DataFrame
merged_df = pd.merge(question_df, ans_df, on='question_id', suffixes=('_question', '_answer'))

# 查看合并后的dataFrame
merged_df.head(10)

我们定义一个完整的函数进行转换:

复制代码
import json

def export_conversations_to_json(df, num_records, file_name):
    """
    将对话数据导出到JSON文件。
    
    :param df: 包含对话数据的 DataFrame
    :param num_records: 要导出的记录数
    :param file_name: 输出 JSON文件的名称
    """
    output = []
    
    # 遍历DataFrame并构建所需的数据结构
    for i, row in df.head(num_records).iterrows():
        identity = f"identity_{i}"
        conversation = [
            {"from": "user",
             "value": row['content_question']},
            {"from": "assistant",
             "value": row['content_answer']}
        ]
        output.append({"id": identity,
                      "conversations": conversation})
    # 将列表转换为JSON格式并保存为文件
    with open(file_name, 'w', encoding='utf-8') as f:
        json.dump(output, f, ensure_ascii=False, indent=2)

实施转换:

复制代码
# 使用示例
export_conversations_to_json(merged_df, 20000, 'medical_treatment.json')

再查看一下转换后的数据:

复制代码
import pandas as pd

# 假设df是你的DataFrame
df = pd.read_json('medical_treatment.json')

# 查看前两条数据
df.head(2)

也可以到pycharm或者jupyterlab中查看,转换后的数据格式:

到这里数据准备妥当了,开始修改微调的配置文件,启动微调。

启动LoRA微调

修改微调脚本

我是单GPU,因此选择的是finetune_lora_single_gpu.sh:

修改对应的路径:

注意,这里都需要使用绝对路径。

还有两处修改:

也可以调整每批次的训练数据,来最大化利用显存:

启动微调脚本

在终端上输入:

复制代码
bash finetune_lora_single_gpu.sh

看一下显存占用

1.8B模型的LoRA微调,占用也就8GB显存

这个太久了,把参数修改一下:

接下来等待一个小时,发现已经微调完毕了:

在finetune文件夹下多出一个文件夹:

里面有相应的参数,以及checkpoint文件夹。我这里发现最后一步1250的checkpoint未保存,因为我设置的是每500次迭代保存一次。

启动LoRA微调后的模型

检查peft版本

复制代码
pip show peft

如果peft版本大于多等于0.8.0,要进行版本降级:

复制代码
pip install peft==0.6.2

通过peft加载微调后的模型:

复制代码
from peft import AutoPeftModelForCausalLM
# 设置LoRA微调后的模型存储路径(checkpoint)
model = AutoPeftModelForCausalLM.from_pretrained("/home/renjintao/nlp/Qwen/finetune/output_qwen_medical/checkpoint-1000/", device_map='auto',trust_remote_code=True).eval()
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("/home/renjintao/nlp/Qwen/model/qwen/Qwen-1_8B-Chat", trust_remote_code=True)

启动对话:

复制代码
# 第一轮对话
response, history = model.chat(tokenizer, "我月经已经超过20天没来了用试纸检查没有怀孕,我刚刚参加工作会不会是工作压力导致的", history =None)
print(response)

回答:

如果不采用微调模型的回答:

其实从该回答上来看已经与未经过微调的模型有很大的区别了,LoRA微调已经使得模型在回答医疗相关的问题上有很大的改变。

下一篇将描述微调模型的保存,合并,以及对微调前后的模型进行对比。

相关推荐
财经资讯数据_灵砚智能8 分钟前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年5月12日
人工智能·python·信息可视化·自然语言处理·ai编程
2301_8159019732 分钟前
C#怎么使用协变和逆变 C#泛型中的in和out关键字协变逆变是什么意思怎么用【语法】
jvm·数据库·python
Pkmer35 分钟前
LeetCode 上极少见的工程级滑窗实现
python·leetcode
m0_4636722036 分钟前
SQL优化SQL关联查询中的排序字段_减少临时空间占用与内存开销
jvm·数据库·python
FreakStudio43 分钟前
开源分享|用MicroPython 做了个 AI 小鸡,它会长大,还记得我所有的情绪
python·单片机·嵌入式·面向对象·并行计算·电子diy·电子计算机
iuvtsrt1 小时前
存储过程如何处理海量数据的批处理_循环提交与分段LIMIT结合
jvm·数据库·python
yexuhgu1 小时前
SQL如何检查字符串是否存在:INSTR与LOCATE函数使用
jvm·数据库·python
2301_783848651 小时前
SQL如何用SQL子查询实现关联报表生成_嵌套逻辑关联多表
jvm·数据库·python
八月欢喜1 小时前
【Facebook】 实时消息监控难点解析
javascript·python·facebook
l1t1 小时前
JIT执行python脚本的工具codon安装和测试
开发语言·python