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

news2024/11/28 3:16:43

前段时间其实我们已经部署了大模型,并开放了对外的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.coloradmin.cn/o/1844636.html

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

相关文章

『 Linux 』 进程间通信概述

文章目录 什么是进程间通信为什么要有进程间通信如何进行进程间通信 什么是进程间通信 进程间通信(IPC)指的是在操作系统重,允许两个或者多个进程之间传递信息或者数据的机制; 进程是操作系统重独立运行的实体,即进程间具有独立性,存在自己的地址空间; 因此进程间默认无法直接访…

多模块开发

简介 Git 通过子模块来解决复用模块的问题。 submodule允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中&#xff0c;同时还保持提交的独立。而subtree可以将子模块合并到主模块由主模块完全管理。 git subModule Git地址&#…

MySQL----利用Mycat配置读写分离

首先确保主从复制是正常的&#xff0c;具体步骤在MySQL----配置主从复制。MySQL----配置主从复制 环境 master(CtenOS7)&#xff1a;192.168.200.131 ----ifconfig查看->ens33->inetslave(win10)&#xff1a;192.168.207.52 ----ipconfig查看->无线局域网适配器 WLA…

RabbitMQ 开发指南

连接RabbitMQ 连接方式一&#xff1a; 也可以选择使用URI的方式来实现 连接方式二&#xff1a; Connection接口被用来创建一个Channel&#xff0c;在创建之后&#xff0c;Channel可以用来发送或者接收消息。 Channel channel conn.createChannel();使用交换器和队列 声明…

React 中的服务器渲染组件

在前后分离架构以前&#xff0c;所有的 Html 业务都是后端渲染&#xff0c;返回前前端显示&#xff0c;后端渲染把前后端逻辑耦合在一起&#xff0c;增大系统的复杂度&#xff0c;不易于扩展。React 中的 Server组件&#xff0c;准确的说是服务器进行渲染&#xff0c;无论是什么…

物联网边缘网关在物联网应用中有哪些优势?天拓四方

随着物联网技术的快速发展&#xff0c;越来越多的设备接入网络&#xff0c;数据交互日益频繁&#xff0c;对数据处理和传输的要求也越来越高。在这样的背景下&#xff0c;物联网边缘网关应运而生&#xff0c;以其低延迟、减少带宽消耗、提高数据质量和安全性等优势&#xff0c;…

小林图解系统-三、操作系统结构

Linux 内核 vs Windows 内核 内核 作为应用连接硬件设备的桥梁&#xff0c;保证应用程序只需要关心与内核交互&#xff0c;不需要关心硬件的细节 内核具备四个基本能力&#xff1a; 管理进程、线程&#xff0c;决定哪个进程、线程使用CPU&#xff0c;也就是进程调度的能力&a…

ArcGIS查找相同图斑、删除重复图斑

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 这次是上次 今天分享一下&#xff0c;很重要却被大家忽略的两个工具 这两个工具不仅可以找出属性…

【总线】AXI4第二课时:深入AXI4总线的基础事务

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

PHP转Go系列 | 条件循环的使用姿势

大家好&#xff0c;我是码农先森。 条件 在 PHP 语言中条件控制语句&#xff0c;主要有 if、elseif、else 和 switch 语句 // if、elseif、else 语句 $word "a"; if ($word "a") {echo "a"; } elseif ($word "b") {echo "b&…

【论文笔记】LoRA LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

题目&#xff1a;LoRA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS 来源: ICLR 2022 模型名称: LoRA 论文链接: https://arxiv.org/abs/2106.09685 项目链接: https://github.com/microsoft/LoRA 文章目录 摘要引言问题定义现有方法的问题方法将 LORA 应用于 Transformer 实…

无源编缆测尺助力料场实现自动化堆取料作业

随着工业4.0时代的到来&#xff0c;智能化、无人化成为现代工业发展的重要趋势。在港口码头、钢铁冶金、焦化等高耗能行业中&#xff0c;如何实现物料的精准测量与无人化操作&#xff0c;成为企业提高生产效率、降低人工成本的关键。武汉市微深节能科技有限公司凭借其先进的分段…

【面试干货】抽象类与接口的区别

【面试干货】抽象类与接口的区别 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程中&#xff0c;抽象类和接口是两个非常重要的概念&#xff0c;它们都为代码的可扩展性和复用性提供了基础。但是&#xff0c;它们之间也有一些明显…

class的流光效果

效果图&#xff1a; 代码示例 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&g…

React路由笔记(函数组件,自用)

配置 npm i react-router-dom基本使用 目录结构 在src中创建page文件夹放置各页面组件&#xff0c;router中放置路由 1、router中配置路由 在/router/index.js中&#xff0c;使用createBrowserRouter配置路由。 import { createBrowserRouter } from "react-router…

[Python人工智能] 四十六.PyTorch入门 (1)环境搭建、神经网络普及和Torch基础知识

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解合如何利用keras和tensorflow构建基于注意力机制的CNN-BiLSTM-ATT-CRF模型,并实现中文实体识别研究。这篇文章将介绍PyTorch入门知识。前面我们的Python人工智能主要以TensorFlow和Keras为主,…

Flutter第十四弹 抽屉菜单效果

目标&#xff1a; 1.怎么构建抽屉菜单效果&#xff1f; 2.抽屉菜单怎么定制&#xff1f; 一、抽屉菜单 侧滑抽屉菜单效果 1.1 抽屉菜单入口 Flutter 的脚手架Scaffold&#xff0c;默认提供了抽屉菜单效果入口。 主页面采用一个简单的页面&#xff0c;侧滑菜单首先使用一个I…

三星与SK海力士:以混合键合技术引领3D DRAM革新之路

在高速缓存内存&#xff08;HBM&#xff09;领域持续领跑的三星与SK海力士&#xff0c;正以混合键合技术为突破口&#xff0c;开启3D DRAM技术的新纪元。这一战略转型不仅预示着存储技术的深度革新&#xff0c;更体现了两大半导体巨头在提高集成度、优化性能与成本上的不懈追求…

【计算机网络篇】数据链路层(11)在数据链路层扩展以太网

文章目录 &#x1f354;使用网桥在数据链路层扩展以太网&#x1f95a;网桥的主要结构和基本工作原理&#x1f388;网桥的主要结构&#x1f50e;网桥转发帧的例子&#x1f50e;网桥丢弃帧的例子&#x1f50e;网桥转发广播帧的例子 &#x1f95a;透明网桥&#x1f50e;透明网桥的…

图论——代码随想录打卡

1 DFS深度搜索算法 深度优先搜索算法是从一个方向去进行搜索&#xff0c;直到遇到走不下去的终点&#xff0c;再进行回溯更换方向&#xff0c;重新进行搜索。因此有回溯也就意味着存在递归&#xff1a; void dfs(参数&#xff09;{处理节点dfs(图&#xff0c;选择的节点)回溯…