ChatGLM6B LORA微调

news2024/11/16 20:24:36

ChatGLM6B&ChatGLM2-6B微调

目录

ChatGLM6B&ChatGLM2-6B微调

微调硬件需求

3.1. LoRA概述

3.2. LoRA微调ChatGLM步骤

3.2.1. 项目和环境搭建

3.2.2. 数据集处理

3.2.3. 微调

3.2.4. 推理

3.2.5. 完整过程

3.3. LoRA微调ChatGLM步骤-——huggingface PEFT

3.3.1. 项目和环境搭建


官方文档:ChatGLM微调实训

【官方教程】ChatGLM-6B 微调:P-Tuning,LoRA,Full parameter

微调硬件需求

量化等级

最低GPU显存(推理)

最低GPU显存(高效参数微调)

FP16(无量化)

13G

14G

INT8

8G

9G

INT4

6G

7G

  1. P-Tuning 微调
  2. P-Tuning v2 微调
  3. LoRA微调

paper:LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

3.1. LoRA概述

LoRA方法,通过精心设计的策略和技术手段,最大限度地提升模型在低资源环境下的性能。

传统的 微调方法可能需要大量的训练数据和计算资源,但是现实场景中,往往存在数据有限计算资源有限的情况。因此,LoRA的目标是克服这些限制,实现高效低资源微调。

LoRA(Low-Rank Adaptation)微调冻结了预训练的模型权重,并将可训练的分解矩阵注入到Transformers架构的每一层,极大地减少了下游任务的可训练参数的数量。基于LoRA的微调产生保存了新的权重,可以将生成的LORA权重认为是一个原来预训练模型的补丁权重。所以LORA模型无法单独使用,需要搭配原模型,两者进行合并即可获得完整版权重。

如下图所示,左边是预训练模型的权重,输入输出维度都是d,在训练期间被冻结,不接受梯度更新。右边部分对A使用随机的高斯初始化,B在训练开始时为零,r是秩,会对△Wx做缩放 α/r。

原理:

目前 LORA 已经被 HuggingFace 集成在了PEFT(Parameter-Efficient Fine-Tuning)代码库里,模型微调好之后需要额外加载 LORA 参数。

3.2. LoRA微调ChatGLM步骤

【NLP修炼系列之玩转LLM】基于LORA的高效微调ChatGLM方法 - 知乎

3.2.1. 项目和环境搭建

采用提供好的LORA微调方法:

# step1:clone
git clone https://github.com/mymusise/ChatGLM-Tuning.git
# step2:安装环境 
pip install -r requirements.txt
'''
# requirements.txt 文件如下
pip install bitsandbytes==0.37.1 accelerate==0.17.1 protobuf>=3.19.5 transformers==4.27.1 icetk cpm_kernels==1.0.11 torch>=1.13.1 tensorboard datasets==2.10.1 git+https://github.com/huggingface/peft.git
'''

3.2.2. 数据集处理

这里微调的数据集格式采用的是斯坦福的羊驼(Stanford Alpaca)数据集格式alpaca_data.json进行参数高效微调。将alpaca_data.json 转化成alpaca_data.jsonl数据【即每行一条json语料】

alpaca_data.json

alpaca_data.jsonl

# step3:数据处理
python cover_alpaca2jsonl.py \
    --data_path data/alpaca_data.json \
    --save_path data/alpaca_data.jsonl \

3.2.3. 微调

首先对处理好的数据进行 Tokenizer处理

# step4:数据Tokenizer处理,修改tokenize_data_rows.py文件中的 read_jsonl()
# 修改Tokenizer为本地模型ChatGLM-6b
# tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
chatglm_6b_model_path = "/root/new_datas/ChatGLM-Tuning/model/chatglm-6b"
tokenizer = AutoTokenizer.from_pretrained(chatglm_6b_model_path, trust_remote_code=True)
config = AutoConfig.from_pretrained(chatglm_6b_model_path, trust_remote_code=True, device_map='auto')

python tokenize_dataset_rows.py \
    --jsonl_path data/alpaca_data.jsonl \
    --save_path data/alpaca \
    --max_seq_length 200 \ 
    --skip_overlength

--jsonl_path: 微调的数据路径,格式【jsonl】,对每行的【'context'】&【'target'】字段进行encode

--max_seq_length 最大样本长度

--save_path 输出路径

# step5: 修改 finetune.py中的main()
# init model
model = AutoModel.from_pretrained(chatglm_6b_model_path, load_in_8bit=True, trust_remote_code=True, device_map="auto"
)
python finetune.py \
    --dataset_path data/alpaca \
    --lora_rank 8 \
    --per_device_train_batch_size 6 \
    --gradient_accumulation_steps 1 \
    --max_steps 500 \
    --save_steps 50 \
    --save_total_limit 2 \
    --learning_rate 1e-4 \
    --fp16 \
    --remove_unused_columns false \
    --logging_steps 50 \
    --output_dir output

以上模型的微调就结束了,微调出来的LORA模型保存在output文件夹下,后面推理过程需要用到LORA模型参数加载。

3.2.4. 推理

from peft import PeftModel
def get_model():
    tokenizer = AutoTokenizer.from_pretrained("/root/new_datas/chatglm/ChatGLM-6B/model/chatglm-6b", trust_remote_code=True)
    model = AutoModel.from_pretrained("/root/new_datas/chatglm/ChatGLM-6B/model/chatglm-6b", trust_remote_code=True).half().cuda()
    model = PeftModel.from_pretrained(model, "output").half()
    model = model.eval()
    return tokenizer, model

3.2.5. 完整过程

# step1:clone
git clone https://github.com/mymusise/ChatGLM-Tuning.git

# step2:安装环境 
pip install -r requirements.txt

# step3:数据处理
python cover_alpaca2jsonl.py \
    --data_path data/alpaca_data.json \
    --save_path data/alpaca_data.jsonl

# step4:数据Tokenizer处理,修改tokenize_data_rows.py文件中的 read_jsonl()
# 修改Tokenizer为本地模型ChatGLM-6b
# tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
chatglm_6b_model_path = "/root/new_datas/ChatGLM-Tuning/model/chatglm-6b"
tokenizer = AutoTokenizer.from_pretrained(chatglm_6b_model_path, trust_remote_code=True)
config = AutoConfig.from_pretrained(chatglm_6b_model_path, trust_remote_code=True, device_map='auto')

python tokenize_dataset_rows.py \
    --jsonl_path data/alpaca_data.jsonl \
    --save_path data/alpaca \
    --max_seq_length 200 \ 
    --skip_overlength

# step5: 修改 finetune.py中的main()
# init model
model = AutoModel.from_pretrained(chatglm_6b_model_path, load_in_8bit=True,trust_remote_code=True, device_map="auto")
python finetune.py \
    --dataset_path data/alpaca \
    --lora_rank 8 \
    --per_device_train_batch_size 6 \
    --gradient_accumulation_steps 1 \
    --max_steps 500 \
    --save_steps 50 \
    --save_total_limit 2 \
    --learning_rate 1e-4 \
    --fp16 \
    --remove_unused_columns false \
    --logging_steps 50 \
    --output_dir output

# step6: 推理

from peft import PeftModel
def get_model():
    tokenizer = AutoTokenizer.from_pretrained("/root/new_datas/chatglm/ChatGLM-6B/model/chatglm-6b", trust_remote_code=True)
    model = AutoModel.from_pretrained("/root/new_datas/chatglm/ChatGLM-6B/model/chatglm-6b", trust_remote_code=True).half().cuda()
    model = PeftModel.from_pretrained(model, "output").half()
    model = model.eval()
    return tokenizer, modelcbn

3.3. LoRA微调ChatGLM步骤-——huggingface PEFT

PEFT(Parameter-Efficient Fine-Tuning)

【微调】CHATGLM2-6B LoRA 微调 - 知乎

3.3.1. 项目和环境搭建

# step1: clone项目
git clone https://github.com/huggingface/peft.git

# step2:环境准备
pip install -r requirements.txt


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

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

相关文章

通过动态地址解决网络数据采集问题

动态地址的作用 说到Python网络爬虫,很多人都会遇到困难。最常见的就是爬取过程中IP地址被屏蔽。虽然大部分都是几个小时内自动解封的,但这对于分秒必争的python网络爬虫来说,是一个关键性的打击!当一个爬虫被阻塞时,…

Qt项目环境构建

工欲善其事必先利其器,使用Qt来进行开发,得先配置好一个合适的环境。下面是我关于Qt项目环境构建的一些小结 Qt的项目构建主要依赖.pro文件(和.pri文件:include包含文件,提供pro的复用性高的东西给多个项目包含) 所以新…

【企业架构框架】Mitre 架构联邦

定义: 架构联合是用于企业架构开发、维护和使用的框架,它对齐、定位和链接分离但相关的架构和架构信息,以向用户提供无缝的外观。 关键词: 企业架构,联邦架构,适合联邦,语义对齐,分层…

想要做好联络口译,需要掌握哪些技能?

据了解,联络口译员经常需要陪在外宾或者委托人身边出席各种各样的活动,除了翻译工作之外,有时还要兼任接待、导游等工作。那么,想要做好联络口译工作,需要掌握哪些技能? 首先,熟悉中外文化差异及…

在页面里面引入外部网页或者vue的其他页面组件

<div id"iframe-container"><iframe :src"iframeUrl" width"100vw" height"100vh" v-if"flagTwo"></iframe> </div>//可以是路径也可以是网络链接 data(){ return{iframeUrl :, }this.iframeUrl h…

从0到1精通自动化测试,pytest自动化测试框架,Hooks函数获取用例执行结果(二十三)

一、前言 pytest提供的很多钩子(Hooks)方法方便我们对测试用例框架进行二次开发&#xff0c;可以根据自己的需求进行改造 先学习下pytest_runtest_makereport这个钩子方法&#xff0c;可以更清晰的了解用例的执行过程&#xff0c;并获取到每个用例的执行结果 二、pytest_run…

【Part 1】现在去博物馆都预约不上了,黑产多少有点疯狂了

近几年不知道为啥&#xff0c;突然兴起博物馆热了&#xff0c;去某个城市&#xff0c;总想去当地的博物馆去打卡&#xff08;当然&#xff0c;可能重点还在打卡&#xff09;。但是周末去湖南省博物馆&#xff0c;发现免费的博物馆&#xff0c;现在已经预约不上了&#xff0c;最…

python面向对象编程学习1

python面向对象的基本要点&#xff0c; 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 使用 class 语句来创建一个新类&#xff0c;class 之后为类的名称并以冒号结尾&#xff1b; __init__()方…

lammps教程:固定边界丢失原子的几种解决办法

我是小马老师&#xff0c;本文介绍固定边界丢失原子的几种解决办法。 在lammps摩擦、润湿、冲击等模拟中&#xff0c;z方向多设为固定的f边界&#xff0c;如何设置不合理&#xff0c;会出现丢失原子的情况。 1.原因分析 以切削模拟为例&#xff0c;边界条件设为ppf&#xff…

PHP+MySQL:查询所有表格信息

效果 代码 $sql "SHOW TABLES"; $sql "SHOW TABLES"; $result DB_query($sql, $db); $myrow DB_fetch_array($result) echo <td> <a href" . $RootPath . /table_detial.php?table_name . $myrow[0] . "> . $myrow[0] . …

使用Secure CRT自动记录日志的方法

窍门一&#xff1a;自动记录系统日志 配置网络或者系统设备&#xff0c;日志记录必可不少。 养成日志记录的工作习惯在某些关键时候绝对能够帮你大忙。可以帮你记录设备的交互信息&#xff0c;方便后续问题追溯。 例如配置过程中出现故障&#xff0c;你需要自证清白&#xf…

MQ(消息中间件)概述及 RabbitMQ 的基本介绍

概述 消息中间件&#xff08;MQ&#xff09; 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用解耦&#xff0c;异步消息&#xff0c;流量削锋等问题&#xff0c;实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。流量削锋 &#xff1a; 削减…

云原生之深入解析Hadoop如何在K8S环境中部署

一、准备工作 Hadoop 是 Apache 软件基金会下一个开源分布式计算平台&#xff0c;以 HDFS&#xff08;Hadoop Distributed File System&#xff09;、MapReduce&#xff08;Hadoop2.0 加入了 YARN&#xff0c;Yarn 是资源调度框架&#xff0c;能够细粒度的管理和调度任务&…

Java8中Lambda表达式和方法引用

一、Lambda表达式 1.1 函数式编程思想 1&#xff09;概念 ​ 面向对象思想需要关注用什么对象完成什么事情。而函数式编程思想就类似于我们数学中的函数。它主要关注的是对数据进行了什么操作。 2&#xff09;优点 代码简洁&#xff0c;开发快速接近自然语言&#xff0c;易…

1-n范围内的质数查找:埃拉托斯特尼筛法

文章目录 质数查找思路质数定义代码思路 写法重要逻辑&#xff1a;第一层for循环结束条件是i * i < n而不是i<n第二层循环如何筛查i所有倍数 完整版&#xff1a;返回0-n正整数中所有质数时间复杂度例题参考资料&#xff1a; 质数查找思路 质数定义 质数是一个自然数&am…

操作系统之调度算法总结

目录 一、进度调度算法 二、内存调度算法 一、先来先服务调度算法 二、最短寻道时间优先调度算法 三、扫描算法 四、循环扫描算法 五、LOOK和C-LOOK算法 三、内存页面置换算法 一、进度调度算法 常见的进度调度算法以及特点如下&#xff1a; 二、磁盘调度算法 一、先…

【大数据】初步认识StarRocks

StarRocks是什么 StarRocks 是新一代极速全场景 MPP 数据库。 StarRocks 充分吸收关系型 OLAP 数据库和分布式存储系统在大数据时代的优秀研究成果&#xff0c;在业界实践的基础上&#xff0c;进一步改进优化、升级架构&#xff0c;并增添了众多全新功能&#xff0c;形成了全新…

数据挖掘18大算法实现以及其他相关经典DM算法:决策分类,聚类,链接挖掘,关联挖掘,模式挖掘、图算法,搜索算法等

【机器学习入门与实践】入门必看系列&#xff0c;含数据挖掘项目实战&#xff1a;模型融合、特征优化、特征降维、探索性分析等&#xff0c;实战带你掌握机器学习数据挖掘 专栏详细介绍&#xff1a;【机器学习入门与实践】合集入门必看系列&#xff0c;含数据挖掘项目实战&…

TiDB(1):TiDB简介

1 从MySQL到TiDB 1.1 场景引入 假设现在有一个高速发展的互联网公司,核心业务库MySQL的数据量已经近亿行,且还在不断增长中,公司对于数据资产较为重视,所有数据要求多副本保存至少5年,且除了有对历史数据进行统计分析的离线报表业务外,还有一些针对用户数据实时查询的需求,如用…

软件测试技能,JMeter压力测试教程,签名sign(BeanShell 预处理程序)(二十)

前言 一般公司对外的接口都会用到sign签名&#xff0c;对不同的客户提供不同的apikey ,这样可以提高接口请求的安全性&#xff0c;避免被人抓包后乱请求 之前讲过用python代码实现sign签名&#xff0c;这次介绍jmeter上如何实现sign签名&#xff0c;思路都是差不多的 一、si…