创新实训2024.06.17日志:大模型微调总结

前段时间其实我们已经部署了大模型,并开放了对外的web接口。不过由于之前某几轮微调实验的大模型在对话时会有异常表现(例如响应难以被理解),因此我在项目上线后,监控了数据库里存储的对话记录。确定了最近一段时间部署的大模型回复一切正常后,着手写这篇有关大模型微调记录的博客。

1. 数据汇总

之前我们采用人工编写、从非结构化的文本中提取、self-instruct生成和self-QA生成的方式,搜集并生成了微调训练所需的数据集。在微调前,我们先对这些数据进行了聚合,把它整理成一个微调软件/程序能够接受的格式。格式如:

{

           "instruction": xxx,

           "input": xxx,

           "output": xxx

}

并非每条指令都有instruction和input的内容,这部分之前的博客也说了,instruction和input的界限不是很明显。如果是分类问题的话,两者都是必须的,其他问题并非必须都要有。

数据集如下图所示: 

经整理,共有如下来源:

  1. 《周易》古经:64卦的卦辞、爻辞原文、译文。卦爻辞分词。
  2. 《易传》(十翼)原文、译文。
  3. 现代资料:《周易译注》、《易学百科全书》卦爻辞词条。
  4. 经典易学典籍:《周易注》、《周易正义》、《周易本义》、《周易集解》等。
  5. 《周易研究》期刊1988-2023共36年的文章数据。平均一年6期,一期10篇,36年共1800篇文章。

2. lora微调:L40+LLaMA-Factory

2.1. 软硬件环境说明

对于glm3-6b这个超参数量比较小的大模型,我们采用了学院的带有八张L40显卡的机器(导师申请的)以及开源微调软件LLaMA-Factory进行微调。

软件环境

微调工具:LLaMA-Factory

LLaMA-Factory开源软件仓库地址:

hiyouga/LLaMA-Factory: Unify Efficient Fine-Tuning of 100+ LLMs (github.com)icon-default.png?t=N7T8https://github.com/hiyouga/LLaMA-Factory这个项目提供了命令行和GUI的微调工具,尤其是GUI,非常适合超参数数量在小型和中等规模参数的大模型进行微调。可以手动选择参数以及微调方式(Lora,RHLF等)

服务器:Linux ubuntu发行版

CUDA:12.4

驱动版本:550.54.15

硬件环境

学院服务器,八张L40显卡。

2.2. LLaMA-Factory微调工具安装部署

根据Github仓库上的README,我们可以快速部署LLaMA-Factory

这个软件对依赖环境有所要求,如下图:

在部署软件前,我已经保证了本地的依赖环境是符合上述表格的:python 311,torch 230 

拉取代码安装依赖

git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"

部署微调用的训练集

把之前按照Alpaca格式风格的数据集放置到data文件夹下(以json格式保存)

随后再到dataset_info中编辑这个新的数据集(webui和脚本都会读取这个配置文件,以获取数据集)

利用web gui微调

LLaMA-Factory提供了一套web界面来进行微调,这样我们只需要再选项卡中选择自己需要的参数就可以了,不用再在命令行拼接一堆参数选项启动脚本进行微调了。

web gui启动命令:

llamafactory-cli webui

随后你就能看到微调的gui界面,在这个界面中,我们可以选择数据集,微调方式,各种参数。

此处我就使用了我们之前配置好的数据集,同时还有其他参数需要选择。这里我用表格记录下来了。

微调参数/微调模型glm3-6bglm3-6bglm3-6bglm3-6bglm3-6bglm3-6b
学习率5e-55e-55e-55e-55e-55e-5

训练轮数

3333050100
批处理大小44410104
最大梯度范数1.01.01.01.01.01.0
最大样本数100000100000100000100000100000100000
计算类型fp16fp16fp16fp16fp16fp16
截断长度102410241024102410241024
梯度累计888888
验证集比例0.10.10.10.10.10.1
学习率调节器cosinecosinecosinecosinecosinecosine
日志间隔555555
保存间隔100100100100100100
优化器adamwadamwadamwadamwadamwadamw
LoRA秩888888
LoRA缩放系数161616161616
LoRA随机丢弃0.10.10.10.10.10.1
GPUL40*1L40*4L40*8L40*4L40*4L40*8
Tran_sample/s1.9793.87614.0397.0329.63213.948
Train_step/s0.0620.030.0550.0550.120.054
运行时间4:48:022:27:030:37:2612:10:0016:26:0020:26:00

 可以看到大部分时间都是比较长的(即便用上所有8个核心),这也是后来转战华为昇腾服务器的原因之一。

这里我贴一下部分训练的epoch-loss图像:

这边LLaMA-Factory是做了数据平滑去噪,在微调的指令中有个是否绘制损失函数图像的参数,选择true后绘制出来的图像就是这样,平滑的代码应该已经写到求损失函数的部分中了。loss不至于像原来那样那么震荡。同时可以看到我们的loss其实并没有降到最低就停止了epoch,所以模型有点欠拟合,这导致部分模型在基线测试是性能不够好。

在得到了模型权重文件后,我们就可以把它部署到服务器了,例如:

我在服务器上存放了我们微调过的大模型,每个都形如:

 其中包括了所有的权重文件与配置文件。

这样我们在带着大模型启动时,选择其中一个进行启动即可,一般我都选的L40*8微调100轮的那个(虽然在之前基线测试时,表现最好的是Qwen微调1000轮的,但是我们4090显卡就24G显存,Qwen14B权重模型一个就20多G了,带不动)

lora微调原理

参考:大模型高效微调-LoRA原理详解和训练过程深入分析 - 知乎 (zhihu.com)

LoRA(Low-Rank Adaptation of LLMs),即LLMs的低秩适应,是参数高效微调最常用的方法。

LoRA的本质就是用更少的训练参数来近似LLM全参数微调所得的增量参数,从而达到使用更少显存占用的高效微调。

LoRA的核心思想是,在冻结预训练模型权重后,将可训练的低秩分解矩阵注入到的Transformer架构的每一层中,从而大大减少了在下游任务上的可训练参数量。

We propose Low-Rank Adaptation(LoRA), which freezes the pre trained model weights and injects trainable rank decomposition matrices into each layer of the Transformer architecture, greatly reducing the number of trainable parameters for downstream tasks. 

通常,冻结预训练模型权重,再额外插入可训练的权重是常规做法,例如Adapter。可训练的权重学习的就是微调数据的知识。但它们的问题在于,不仅额外增加了参数,而且还改变了模型结构。这会导致模型训练、推理的计算成本和内存占用急剧增加,尤其在模型参数需在多GPU上分布式推理时(这越来越常见)。

深度网络由大量Dense层构成,这些参数矩阵通常是满秩的。

相关工作表明,When adapting to a specific task, 训练学到的过度参数化的模型实际上存在于一个较低的内在维度上(高维数据实际是在低维子空间中)

 LoRA就假设LLM在下游任务上微调得到的增量参数矩阵Δ𝑊是低秩的(肯定不是满秩),即存在冗余参数或高度相关的参数矩阵,但实际有效参数是更低维度的。LoRA遂设想,对全参数微调的增量参数矩阵Δ𝑊进行低秩分解近似表示(即对参数做降维)。

We hypothesize that the change in weights during model adaptation also has a low “intrinsic rank”, leading to our proposed Low-Rank Adaptation (LoRA) approach.

这样训练Δ𝑊的低秩分解近似参数矩阵,效果上相比其他PEFT方法不会打什么折扣,而且还能在推理时不增加额外开销。 

LoRA allows us to train some dense layers in a neural network indirectly by optimizing rank decomposition matrices of the dense layers’change during adaptation instead, while keeping the pre-trained weights frozen

3. 华为昇腾服务器微调:MindFormers+ModelLink

华为提供了一套一体化的、全流程的大模型微调工具MindFormers+ModelLink

  1. MindFormers(MindSpore): 华为自家提供的一个构建大模型训练、微调、评估、推理、部署的全流程开发套件
  2. ModelLink(Pytorch+Megatron) ModelLink旨在为华为昇腾芯片上的大语言模型提供端到端的解决方案, 包含模型,算法,以及下游任务。

ModelLink也是开源的:

ModelLink: 昇腾大模型仓库 (gitee.com)icon-default.png?t=N7T8https://gitee.com/ascend/ModelLinkModelLink对于不同大模型的微调步骤,专门分门别类地出了一套教程,这里我以Qwen1-14B为例:

首先克隆仓库到本地服务器:

git clone https://gitee.com/ascend/ModelLink.git
git clone https://github.com/NVIDIA/Megatron-LM.git
cd Megatron-LM
git checkout core_r0.6.0
cp -r megatron ../ModelLink/
cd ..
cd ModelLink
mkdir logs
mkdir model_from_hf
mkdir dataset
mkdir ckpt

随后搭建基本环境(首先保证有conda环境,安装conda网上很多教程了,我就不多写一遍了)

# python3.8
conda create -n test python=3.8
conda activate test# 安装 torch 和 torch_npu
pip install torch-2.1.0-cp38-cp38m-manylinux2014_aarch64.whl
pip install torch_npu-2.1.0*-cp38-cp38m-linux_aarch64.whl
pip install apex-0.1_ascend*-cp38-cp38m-linux_aarch64.whl# 安装加速库
git clone https://gitee.com/ascend/MindSpeed.git
cd MindSpeed
git checkout 2b0edd2
pip install -r requirements.txt
pip install -e .
cd ..# 安装其余依赖库
pip install -r requirements.txt

下载预训练权重和词表:

mkdir ./model_from_hf/Qwen-14B/
cd ./model_from_hf/Qwen-14B/
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/cache_autogptq_cuda_256.cpp
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/cache_autogptq_cuda_kernel_256.cu
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/config.json
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/configuration_qwen.py
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/cpp_kernels.py
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/generation_config.json
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model-00001-of-00015.safetensors
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model-00002-of-00015.safetensors
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model-00003-of-00015.safetensors
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model-00004-of-00015.safetensors
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model-00005-of-00015.safetensors
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model-00006-of-00015.safetensors
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model-00007-of-00015.safetensors
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model-00008-of-00015.safetensors
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model-00009-of-00015.safetensors
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model-00010-of-00015.safetensors
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model-00011-of-00015.safetensors
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model-00012-of-00015.safetensors
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model-00013-of-00015.safetensors
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model-00014-of-00015.safetensors
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model-00015-of-00015.safetensors
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/model.safetensors.index.json
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/modeling_qwen.py
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/qwen.tiktoken
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/qwen_generation_utils.py
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/tokenization_qwen.py
wget https://huggingface.co/Qwen/Qwen-14B/resolve/main/tokenizer_config.json
cd../../

修改modelling_qwen.py文件第39行,将:

SUPPORT_FP16 = SUPPORT_CUDA and torch.cuda.get_device_capability(0)[0] >= 7

改为:

SUPPORT_FP16 = True

数据集我们有,直接拉到服务器上就可以,放到./dataset(相对路径)下即可

随后利用华为ModelLink提供的process_data.py脚本进行数据处理

python ./tools/preprocess_data.py \     --input ./dataset/datasetQA_final.jsonl \     --tokenizer-name-or-path ./model_from_hf/Qwen-14B-Chat/ \     --output-prefix ./dataset/Qwen-14B-Chat-modelling/alpaca \     --tokenizer-type PretrainedFromHF \     --workers 4 \     --log-interval 1000 \     --handler-name GeneralInstructionHandler \     --append-eod \     --tokenizer-kwargs 'eos_token' '<|endoftext|>' 'pad_token' '<|extra_0|>'

 随后利用其提供的预训练脚本进行训练

 最后,将训练结束后的权重格式从megatron转换为safetensors格式(不然不能用)

python ./tools/checkpoint/convert_ckpt.py --model-type GPT --loader megatron --saver megatron --save-model-type save_huggingface_qwen --target-tensor-parallel-size 8 --target-pipeline-parallel --load-dir ./ckpt/Qwen-14B-Chat-JuDou/ --save-dir ./model_from_hf/Qwen-14B-Chat/ --add-qkv-bias

 最终得到最后训练完的权重文件

3.2. 微调环境

 软件环境

华为服务器宿主机OS:kylinSP3

容器:ubuntu22.04

cann:8,0RC1

驱动版本:24.1.rc1

硬件环境

Atlas800T A2(910b)*8

3.3. 微调参数

Epoch:1000

Time:11422s(3:10:22)

Time/epoch(每轮时长):大概11000ms

速度等性能方面相较L40和H800有较大提升,并且Qwen14B 1000轮全微调是我们微调出来性能最优秀的大模型(唯一美中不足的就是实在太大了没法部署到仅搭载1块4090的服务器上去)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/352149.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多叉树的DFS深度优先遍历,回溯法的基础算法之一

一、前言 多叉树一般用于解决回溯问题。 想必大家都学过二叉树&#xff0c;以及二叉树的深度优先遍历和广度优先遍历&#xff0c;我们思考&#xff1a;能不能将二叉树的DFS转化为多叉树的DFS&#xff1f; 二、多叉树的结构 多叉树的本质&#xff0c;就是一棵普通的树&#x…

【秋招突围】2024届秋招笔试-小红书笔试题-第三套-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f4e7; 清隆这边…

Redis作者长文总结LLMs, 能够取代99%的程序员

引言 这篇文章并不是对大型语言模型&#xff08;LLMs&#xff09;的全面回顾。很明显&#xff0c;2023年对人工智能而言是特别的一年&#xff0c;但再次强调这一点似乎毫无意义。相反&#xff0c;这篇文章旨在作为一个程序员个人的见证。自从ChatGPT问世&#xff0c;以及后来使…

如何用多线程执行 unittest 测试用例实现方案

前言 使用python做过自动化测试的小伙伴&#xff0c;想必都知道unittest和pytest这两个单元测试框架&#xff0c;其中unittest是python的官方库&#xff0c;功能相对于pytest来要逊色不少&#xff0c;但是uniitest使用上手简单&#xff0c;也受到的很多的小伙伴喜爱。一直以来都…

自然语言处理学习路线(1)——NLP的基本流程

NLP基本流程 【NLP基本流程】 0. 获取语料 1. 语料预处理 2. 特征工程&选择 3. 模型训练 4. 模型输出&上线 【NLP基本流程图】 Reference 1. 自然语言处理(NLP)的一般处理流程&#xff01;-腾讯云开发者社区-腾讯云 2. https://zhuanlan.zhihu.com/p/55…

leetcode 1355 活动参与者(postgresql)

需求 表: Friends ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | | activity | varchar | ---------------------- id 是朋友的 id 和该表的主键 name 是朋友的名字 activity 是朋友参加的活动的名字 表: Activit…

【每日刷题】Day67

【每日刷题】Day67 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 23. 合并 K 个升序链表 - 力扣&#xff08;LeetCode&#xff09; 2. 1189. “气球” 的最大数量 - …

动力学笔记01——共振频率和共振带的数学定义

文章目录 0、背景描述1、正文2. 位移、速度、加速度的共振频率并不相同 0、背景描述 过去一年&#xff0c;我基本都在考虑塔架&#xff08;尤其是混塔&#xff09;频率仿真/模态分析的问题。关于这个问题&#xff0c;不仅有地基刚度&#xff0c;还有塔筒本身以及其他影响频率的…

MAC认证

简介 MAC认证是一种基于接口和MAC地址对用户的网络访问权限进行控制的认证方法&#xff0c;它不需要用户安装任何客户端软件。设备在启动了MAC认证的接口上首次检测到用户的MAC地址以后&#xff0c;即启动对该用户的认证操作。认证过程中&#xff0c;不需要用户手动输入用户名…

Linux ubuntu安装pl2303USB转串口驱动

文章目录 1.绿联PL2303串口驱动下载2.驱动安装3.验证方法 1.绿联PL2303串口驱动下载 下载地址&#xff1a;https://www.lulian.cn/download/16-cn.html 也可以直接通过CSDN下载&#xff1a;https://download.csdn.net/download/Axugo/89447539 2.驱动安装 下载后解压找到Lin…

R语言dplyr统计指定列里面种类个数和比例

输入数据框&#xff1a;dfuorf&#xff0c;Type列有uORF和overlpaORF两种类型 dfuorf1 <- dfuorf %>%group_by(Type) %>% summarise(Countn()) %>% mutate(percentCount/sum(Count)) %>% mutate(percent1 (paste0(round((Count/sum(Count)), 2)*100,"%&…

编码在网络安全中的应用和原理

前言:现在的网站架构复杂&#xff0c;大多都有多个应用互相配合&#xff0c;不同应用之间往往需要数据交互&#xff0c;应用之间的编码不统一&#xff0c;编码自身的特性等都很有可能会被利用来绕过或配合一些策略&#xff0c;造成一些重大的漏洞。 什么是编码&#xff0c;为什…

货代小白快来收藏‼️普货与非普货的区别

普货是指不属于以下类别的普通货物 危险品 冷冻/冷藏品 违禁品 仿牌货 敏感货 危险品 危险品具体分为九类&#xff1a; 爆炸品 压缩气体 易燃液体 易燃固体、易燃物品和遇湿易燃物品 氧化剂和有机氧化物 有毒和感染性物品 放射性 腐蚀性 杂类 冷冻/冷藏品 主要是指以食品为主的…

海康视觉算法平台VisionMaster 4.3.0 C# 二次开发01 加载方案并获取结果

前言 第一次使用海康视觉算法平台VisionMaster 4.3.0&#xff0c;项目中要使用这个平台进行视觉处理并获取结果。 运行效果 开发环境 C#&#xff0c; WPF&#xff0c; vs2022, 海康视觉算法平台VisionMaster 4.3.0 基本概念 上图这些.sol为后缀的是vm的方案文件。 打开方案文…

海南云亿商务咨询有限公司助力商家腾飞新高度

在数字化浪潮席卷全球的今天&#xff0c;电商行业正迎来前所未有的发展机遇。海南云亿商务咨询有限公司&#xff0c;作为抖音电商服务的佼佼者&#xff0c;凭借其专业的团队和丰富的经验&#xff0c;正成为越来越多企业实现电商转型与升级的得力助手。 海南云亿商务咨询有限公…

AI写代码,CS还有前途吗?加州大学伯克利分校:CDSS申请人数激增48%!

目录 01 CS入学人数暴涨 02 人类Coder可堪大任 03 AI还没有学会创新 04 编程与农耕不同 AI写了这么多代码&#xff0c;你还应该学习计算机科学吗&#xff1f; 新的数据显示&#xff0c;学生们仍然热衷于选修计算机科学&#xff1a;加州大学伯克利分校&#xff08;UCB&#…

Python基础用法 之 转义字符

将两个字符进⾏转义 表示⼀个特殊的字符 \n ---> 换⾏&#xff0c;回⻋ \t ---> 制表符, tab键 注意&#xff1a; print( end\n)&#xff1a; print() 函数中默认有⼀个 end\n, 所以,每个 print 结束之后, 都会输出⼀ 个换行。 未完待续。

一个示例学习C语言到汇编层面

给出以下代码 #include<stdio.h> int main() {int x 0, y 0, z 0;while (1) {x 0;y 1;do {printf("%d\n", x);z x y;x y;y z;} while (x < 255);}return 0; }我们把这个程序编写成32位程序&#xff0c;然后我们放入IDA中进行分析 .text:0080187…

WebGIS如何加载微件

本篇文章以加载切换底图微件做示范 首先&#xff0c;添加require "esri/widgets/ScaleBar",//比例尺"esri/widgets/Legend",//图例"esri/widgets/basemapGallery" 然后添加加载切换底图的组件代码 const basemapGallery new BasemapGallery(…

SaaS产品运营|一文讲清楚为什么ToB产品更适合采用PLG模式?

在数字化时代&#xff0c;ToB&#xff08;面向企业&#xff09;产品市场的竞争愈发激烈。为了在市场中脱颖而出&#xff0c;许多企业开始转向PLG&#xff08;产品驱动增长&#xff09;模式。这种模式以产品为核心&#xff0c;通过不断优化产品体验来驱动用户增长和业务发展。本…