大模型应用实战4——开源大模型微调(基于LLaMA-Factory)

所谓微调,通俗理解就是围绕大模型进行参数修改,从而永久性的改变模型的某些性能。而大模型微调又分为全量微调和高效微调两种,所谓全量微调,指的是调整大模型的全部参数,而高效微调,则指的是调整大模型的部分参数,目前常用的高效微调方法包括LoRA、QLoRA、p-Tunning、Prefix-tunning等。

微调的五大类基础应用------问答风格调整、知识灌注、代码能力增强、Function calling能力增强、Agent能力增强

本文先介绍基于LLaMA-Factory的模型自我意识微调过程

首先准备一些指令集如下

{

instruction : 保持健康的三个提示。 ,

input : ,

output : 以下是保持健康的三个提示:\\n\\n1. 保持身体活动。每天做适当的身体运动,如散步、跑步或游泳,能促进心血管健康,增强肌肉力量,并有助于减少体重。\\n\\n2. 均衡饮食。每天食用新鲜的蔬菜、水果、全谷物和脂肪含量低的蛋白质食物,避免高糖、高脂肪和加工食品,以保持健康的饮食习惯。\\n\\n3. 睡眠充足。睡眠对人体健康至关重要,成年人每天应保证 7-8 小时的睡眠。良好的睡眠有助于减轻压力,促进身体恢复,并提高注意力和记忆力。

},

  1. LLaMA-Factory私有化部署

Step 1. 下载LLaMA-Factory的项目文件

apt install git

cd git clone https://github.com/hiyouga/LLaMA-Factory.git

#通过以上两步把它下载到云端

Step 2. 升级pip版本

建议在执行项目的依赖安装之前升级 pip 的版本,如果使用的是旧版本的 pip,可能无法安装一些最新的包,或者可能无法正确解析依赖关系。升级 pip 很简单,只需要运行命令如下命令:

pip install --upgrade pip

**Step 3. 使用pip安装LLaMA-Factory项目代码运行的项目依赖

在LLaMA-Factory中提供的 `requirements.txt`文件包含了项目运行所必需的所有 Python 包及其精确版本号。使用pip一次性安装所有必需的依赖,执行命令如下:

pip install -r requirements.txt --index-url https://mirrors.huaweicloud.com/repository/pypi/simple

微调流程如下:

Step 1. 创建微调数据集并上传

Step 2. 修改数据集字典,添加数据集说明

Step 3. 创建微调脚本,标注微调关键参数信息

Step 4. 运行微调脚本,获取模型微调权重

Step 5. 合并模型权重,获得微调模型

Step 6. 测试微调效果

Step 1

import json

import random

定义问题和回答

questions = [

请你告诉我你是谁? , 你能介绍一下自己吗? , 你是谁? , 请介绍一下你自己。 ,

能告诉我你的身份吗? , 你的职业是什么? , 你有什么特长? , 你来自哪里? ,

你的工作是什么? , 你的兴趣爱好是什么?

]

responses = [

我是小林,一个致力于帮助人们解决问题的人工智能。 ,

我叫小林,是一名人工智能助手,专门处理数据分析任务。 ,

我是小林,一个从事教育支持的智能助理。 ,

名字叫小林,我是一款专为提供即时信息而设计的智能系统。 ,

我是小林,我能够协助处理各种复杂的数据问题。 ,

我叫小林,是一个人工智能,帮助人们进行科研和数据分析。 ,

我是小林,我的工作是通过机器学习和人工智能技术来支持决策制定。 ,

我是小林,一个设计用来进行语言翻译和沟通辅助的人工智能。 ,

作为小林,我提供基于云的数据处理服务。 ,

我是小林,主要负责数据挖掘和洞察发现。

]

生成100条数据

extended_data_set = []

for _ in range(100):

q = random.choice(questions)

r = random.choice(responses)

extended_data_set.append({

instruction : q,

input : ,

output : r

})

将扩展的数据集写入JSON文件

extended_file_path = 'WAY_zh.json'

with open(extended_file_path, 'w', encoding='utf-8') as file:

json.dump(extended_data_set, file, indent=4, ensure_ascii=False)

extended_file_path

然后使用cp命令,将其复制到LlaMa-Factory项目data文件夹内:

cp WAY_zh.json ~/LLaMA-Factory/data

Step 2. 修改数据集字典,添加数据集说明

"这里我们使用vim命令对该文件进行修改:

"WAY_zh\"

"file_name":"WAY_zh.json"

Step 3. 创建微调脚本

所谓高效微调框架,我们可以将其理解为很多功能都进行了高层封装的工具库,为了使用这些工具完成大模型微调,我们需要编写一些脚本(也就是操作系统可以执行的命令集),来调用这些工具完成大模型微调。这里我们需要先回到LlaMa-Factory项目主目录下:

cd..

然后创建一个名为`single_lora_qwen.sh`的脚本,是一系列命令的集合

export CUDA_DEVICE_MAX_CONNECTIONS=1 ,

export NCCL_P2P_DISABLE= 1 ,

export NCCL_IB_DISABLE= 1 ,#运行环境设置

,

CUDA_VISIBLE_DEVICES=0 python src/train_bash.py ## 单卡运行 ,

--stage sft ## --stage pt (预训练模式) --stage sft(指令监督模式) ,

--do_train True ## 执行训练模型 ,

--model_name_or_path /mnt/workspace/.cache/modelscope/Qwen/Qwen1___5-1___8B-Chat ## 模型的存储路径 ,

--dataset WAY_zh ## 训练数据的存储路径,存放在 LLaMA-Factory/data路径下 ,

--template qwen ## 选择Qwen模版 ,

--lora_target q_proj,v_proj ## 默认模块应作为 ,

--output_dir single_lora_qwen_checkpoint ## 微调后的模型保存路径 ,

--overwrite_cache ## 是否忽略并覆盖已存在的缓存数据 ,

--per_device_train_batch_size 4 ## 用于训练的批处理大小。可根据 GPU 显存大小自行设置。 ,

--gradient_accumulation_steps 8 ## 梯度累加次数 ,

--lr_scheduler_type cosine ## 指定学习率调度器的类型 ,

--logging_steps 5 ## 指定了每隔多少训练步骤记录一次日志。这包括损失、学习率以及其他重要的训练指标,有助于监控训练过程。 ,

--save_steps 100 ## 每隔多少训练步骤保存一次模型。这是模型保存和检查点创建的频率,允许你在训练过程中定期保存模型的状态 ,

--learning_rate 5e-5 ## 学习率 ,

--num_train_epochs 1.0 ## 指定了训练过程将遍历整个数据集的次数。一个epoch表示模型已经看过一次所有的训练数据。 ,

--finetuning_type lora ## 参数指定了微调的类型,lora代表使用LoRA(Low-Rank Adaptation)技术进行微调。 ,

--fp16 ## 开启半精度浮点数训练 ,

--lora_rank 8 ## 在使用LoRA微调时设置LoRA适应层的秩。 ,

然后为了保险起见,我们需要对齐格式内容进行调整,以满足Ubuntu操作系统运行需要(此前是从Windows系统上复制过去的文件,一般都需要进行如此操作):

sed -i 's/ r$//' ./single_lora_qwen.sh

到这儿得到新的微调后的权重,然后

Step 5. 合并模型权重,获得微调模型

首先简单查看merge_model.sh脚本文件内容:

!/bin/bash ,

,

python src/export_model.py ## 用于执行合并功能的Python代码文件 ,

--model_name_or_path /mnt/workspace/.cache/modelscope/Qwen/Qwen1___5-1___8B-Chat ## 原始模型文件 ,

--adapter_name_or_path ~/LLaMA-Factory/single_lora_qwen_checkpoint ## 微调模型权重文件 ,

--template qwen ## 模型模板名称 ,

--finetuning_type lora ## 微调框架名称 ,

--export_dir /mnt/workspace/.cache/modelscope/qwen_lora ## 合并后新模型文件位置 ,

--export_size 2 ,

--export_legacy_format false

然后使用cp命令将其复制到LlaMa-Fcotry项目主目录下:

cd /mnt/workspace ,

cp merge_model.sh ~/LLaMA-Factory ,

cd ~/LLaMA-Factory/ ,

chmod +x ./merge_model.sh ,

sed -i 's/ r$//' ./merge_model.sh ,

接下来即可查看刚刚获得的新的微调模型:

cd /mnt/workspace/.cache/modelscope

Step 6. 测试微调效果

在我们为大模型"灌输"了一系列自主意识之后,我们尝试与其对话,测试此时模型是否会认为自己是"小林"。

qwen_lora = '/mnt/workspace/.cache/modelscope/qwen_lora'

得到回复:

你好,我叫小林,我是来自阿里云的大规模语言模型,能够理解和生成多种自然语言,有任何问题都可以问我'

注意:最终不一定能返回我是小林的回复

相关推荐
ROBOT玲玉3 分钟前
Milvus 中,FieldSchema 的 dim 参数和索引参数中的 “nlist“ 的区别
python·机器学习·numpy
GocNeverGiveUp12 分钟前
机器学习2-NumPy
人工智能·机器学习·numpy
浊酒南街1 小时前
决策树(理论知识1)
算法·决策树·机器学习
B站计算机毕业设计超人1 小时前
计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
大数据·人工智能·爬虫·python·机器学习·课程设计·数据可视化
学术头条1 小时前
清华、智谱团队:探索 RLHF 的 scaling laws
人工智能·深度学习·算法·机器学习·语言模型·计算语言学
18号房客1 小时前
一个简单的机器学习实战例程,使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集(Iris Dataset)**的分类
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·sklearn
feifeikon1 小时前
机器学习DAY3 : 线性回归与最小二乘法与sklearn实现 (线性回归完)
人工智能·机器学习·线性回归
游客5201 小时前
opencv中的常用的100个API
图像处理·人工智能·python·opencv·计算机视觉
古希腊掌管学习的神1 小时前
[机器学习]sklearn入门指南(2)
人工智能·机器学习·sklearn
Ven%2 小时前
如何在防火墙上指定ip访问服务器上任何端口呢
linux·服务器·网络·深度学习·tcp/ip