创新实训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.mzph.cn/web/28787.shtml

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

相关文章

基 CanMV 的 C 开发环境搭建

不论是使用 CanMV 提供的基于 C 语言和 FreeRTOS 的应用开发方式开发应用程序或是编译 CanMV 固件&#xff0c;都需要搭建基于 CanMV 的 C 开发环境&#xff0c;用于编译 CanMV 源码。 1. 开发环境搭建说明 CanMV 提供了基于 C 语言和 FreeRTOS 的应用开发…

【教程】hexo 更换主题后,部署在 Github Page 无 CSS 样式

目录 前言环境hexo 更换主题解决部署到 Github Page 后无 CSS 样式的问题 前言 最近更换了 hexo 的主题后&#xff0c;重新部署到 Github Page 上发现不显示 CSS 样式&#xff0c;但在本地启动时又是正常的效果。此外&#xff0c;检查资源请求&#xff0c;发现多个 .css 文件请…

【软件测试】软件测试入门

软件测试入门 一、什么是软件测试二、软件测试和软件开发的区别三、软件测试在不同类型公司的定位1. 无组织性2. 专职 OR 兼职3. 项目性VS.职能性4.综合型 四、一个优秀的软件测试人员具备的素质1. 技能相关2. 非技能相关 一、什么是软件测试 最常见的理解是&#xff1a;软件测…

【效率提升】倍速插件Global Speed

global speed插件可以控制网页在线视频&#xff0c;能够应用在Edge和Google浏览器中&#xff0c;只需要在插件商店中下载并配置即可。这款插件的配置选项有很多&#xff0c;支持视频倍速&#xff08;最低0.25倍速&#xff0c;最高16倍速&#xff09;&#xff0c;固定标签页&…

【Java开发规范】IDEA 设置 text file encoding 为 UTF-8,且文件的换行符使用 Unix 格式

1. IDEA 设置 text file encoding 为 UTF-8 file -> settings -> editor -> code style -> file encoding Transparent-native-to-asci conversion 要不要勾选&#xff1f;> 不推荐勾选&#xff08;它的作用是用来自动转换ASCII编码&#xff0c;防止文件乱码&am…

Modbus协议转Profibus协议模块接热传感器配置攻略

一、前言 在工业自动化控制领域&#xff0c;Modbus协议和Profibus协议是两种常见的通讯协议&#xff0c;它们在设备之间传输数据起着至关重要的作用。而Modbus协议转Profibus协议模块&#xff08;XD-MDPB100&#xff09;设备&#xff0c;则扮演着连接不同通讯协议的桥梁角色。…

来点干货,比较好用的3D在线展示网站

制作好的3D模型需要客户对3D模型进行确认&#xff0c;图片和视频给过去&#xff0c;后面往往都会扯皮。无意间翻到几个3D展示网站&#xff0c;试用了下都不是很完善&#xff0c;后面在网上大量查阅资料并经过实际使用&#xff0c;发现几个相对比较好用值得推荐的。 1、Sketchf…

Python 数据持久化:使用 SQLite3 进行简单而强大的数据存储

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 SQLite3是一种轻量级嵌入式数据库引擎&#xff0c;它在Python中被广泛使用。SQLite3通常已经包含在Python标准库中&#xff0c;无需额外安装。你只需导入 s…

IRIS论文阅读笔记

这是ICLR2023一篇world model的论文&#xff0c;提出了一个称为IRIS的world model方法模型仍然是分为两部分&#xff0c;一部分是模拟世界的world model&#xff0c;包括预测下一帧的观测&#xff0c;预测当前reward&#xff0c;预测是否terminate的三个输出&#xff1b;第二部…

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…

【Linux命令行】从时间管理->文件查找压缩的指令详解

目录 1.date 命令&#xff08;显示时间&#xff09; 1.1 显示方面 1.2 设定时间 1.3 时间戳转换 1.4 cal&#xff08;日历&#xff09; 2. 重定向 2.1 输出重定向&#xff08;echo >&#xff09;cin 2.2 追加重定向 >> 2.3 输入重定向 < cout 3.find 指…

API接口设计的艺术:如何提升用户体验和系统性能

在数字时代&#xff0c;API接口的设计对于用户体验和系统性能有着至关重要的影响。良好的设计可以显著提升应用程序的响应速度、可靠性和易用性。以下是几个关键点&#xff0c;帮助改善API接口的设计&#xff1a; 1. 理解并定义清晰的要求 用户研究&#xff1a;与最终用户进行…

如何根据使用场景选购3D扫描仪?

三维扫描建模是指通过专业的三维扫描仪对产品进行三维数据的采集&#xff0c;快速获取物体精确的3D数据&#xff0c;实现1:1复刻原物体&#xff0c;扫描后所得的数字化3D模型以obj、fbx、glb、gltf等格式保存。 积木易搭自主研发多款三维扫描设备&#xff0c;拥有多项国家专利&…

【大分享04】OFD版式赋能政务服务电子文件归档和电子档案管理

关注我们 - 数字罗塞塔计划 - 本篇是参加由电子文件管理推进联盟联合数字罗塞塔计划发起的“大分享”活动投稿文章&#xff0c;来自北京数科网维技术有限责任公司&#xff0c;作者&#xff1a;张严。 PART1 政务服务电子文件归档和电子档案管理背景 政务服务是政务服务机构…

RockChip Android12 Settings一级菜单

一:概述 在之前的文章中对Android8.1 Settings的流程进行了说明,本章将针对Android12 Settings一级菜单的加载逻辑进行详细说明,Settings版本之间的差异不是很大,有兴趣的同学可自行学习,本文不在做赘述。 Android8.1 Settings说明:RockChip Android8.1 Settings-CSDN博…

早期发现,健康生活!第三届ZAODX世界肿瘤早筛大会圆满落幕!

2024年6月15日-16日&#xff0c;第三届ZAODX世界肿瘤早筛大会在雄安新区盛大开幕&#xff01;本次会议由河北雄安新区管理委员会公共服务局指导&#xff0c;第三届ZAODX世界肿瘤早筛大会组委会和早筛网主办&#xff0c;粤港澳大湾区精准医学研究院&#xff08;广州&#xff09;…

python GUI开发: tkinter事件处理的几种方式详解与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

GEM5 Garnet +DSENT: NoC power model 功耗模型

0. 简介 现在&#xff08;2024&#xff09;集成的是dsent。 Garnet作者&#xff0c;Turshar在2018年说Orion已经过时不在集成DSENT&#xff0c;但是集成DSENT的代码随着gem5更新也过时了&#xff0c;而他短期内没有更新的计划&#xff08;2018年说的&#xff09;。2023年还有一…

SpringBoot配置第三方专业缓存技术jetcache远程缓存方案和本地缓存方案

JetCache 是一个基于 Java 的分布式缓存解决方案&#xff0c;旨在提供高性能和可扩展性。它支持多种后端存储&#xff0c;如 Redis、Hazelcast、Tair 等&#xff0c;可以作为应用程序的缓存层&#xff0c;有效地提升数据访问性能和响应速度。 JetCache 的主要特点包括&#x…

springboot应用启动太慢排查 半天才打印日志

springboot应用启动太慢排查 半天才打印日志 解决办法 hostnamectl 命令查看主机名 vim /etc/hosts 加上主机名配置 127.0.0.1 hostname